From eebd7307afef55dcb862bddc795f5d4ae5bc34f1 Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Fri, 14 Jan 2022 14:48:04 +0000 Subject: [PATCH] Add c_to_python_font.py. --- README.md | 9 ++- c_to_python_font.py | 164 +++++++++++++++++++++++++++++++++++++++ icon_fonts/back.c | 8 ++ icon_fonts/default.c | 8 ++ icon_fonts/filenames.txt | 7 ++ icon_fonts/fwd.c | 8 ++ icon_fonts/icon_font.jpg | Bin 0 -> 32036 bytes icon_fonts/pause.c | 8 ++ icon_fonts/play.c | 8 ++ icon_fonts/stop.c | 8 ++ writer/WRITER.md | 3 + 11 files changed, 227 insertions(+), 4 deletions(-) create mode 100755 c_to_python_font.py create mode 100644 icon_fonts/back.c create mode 100644 icon_fonts/default.c create mode 100644 icon_fonts/filenames.txt create mode 100644 icon_fonts/fwd.c create mode 100644 icon_fonts/icon_font.jpg create mode 100644 icon_fonts/pause.c create mode 100644 icon_fonts/play.c create mode 100644 icon_fonts/stop.c diff --git a/README.md b/README.md index fb406aa..402a9e4 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,14 @@ The resultant file is usable with two varieties of display device drivers: # 2. Solution -This comprises three components, links to docs below: +This comprises four components, links to docs below: - 1. [font_to_py.py](./FONT_TO_PY.md) This utility runs on a PC and converts a - font file to Python source. See below. + 1. [font_to_py.py](./FONT_TO_PY.md) This utility runs on a PC and converts an + industry standard font file to Python source. See below. 2. [Writer and CWriter classes](./writer/WRITER.md) These facilitate rendering text to a monochrome or colour display having a suitable device driver. - 3. [Device driver notes](./writer/DRIVERS.md). Notes for authors of display + 3. [Creating icon fonts](./icon_fonts/README.md) + 4. [Device driver notes](./writer/DRIVERS.md). Notes for authors of display device drivers. Provides details of the font file format and information on ensuring comptibility with the `Writer` classes. diff --git a/c_to_python_font.py b/c_to_python_font.py new file mode 100755 index 0000000..2fec77b --- /dev/null +++ b/c_to_python_font.py @@ -0,0 +1,164 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2022 Peter Hinch + +import sys +from font_to_py import ByteWriter, var_write, write_func, STR02, STR02H + +STR01 = """# Code generated by c_to_python_font.py. +# Char set: {} +# Cmd: {} +version = '0.10' + +""" + + +class Glyph: + dstart = 0 # Start index of next glyph + def __init__(self): + self.width = 0 + self.height = 0 + + def populate(self, fn, data, idx): + try: + with open(fn, "r") as f: + s = f.readline() + elements = s.split(" ") + if elements[1].endswith("width"): + self.width = int(elements[2]) + data.extend((self.width).to_bytes(2, 'little')) + else: + return False + s = f.readline() + elements = s.split(" ") + if elements[1].endswith("height"): + self.height = int(elements[2]) + else: + return False + s = f.readline() + if not s.startswith("static"): + return False + while s := f.readline(): + if (lb := s.find("}")) != -1: + s = s[:lb] # Strip trailing }; + p = s.strip().split(',') + if not p[-1]: + p = p[: -1] + z = [int(x, 16) for x in p] + data.extend(bytearray(z)) + # index points to start of current data block + idx.extend((Glyph.dstart).to_bytes(2, 'little')) + Glyph.dstart += ((self.width - 1)//8 + 1) * self.height + 2 + except OSError: + return False + return True + + +class Font: + + def __init__(self): + self.glyphs = [] + self.height = 0 + self.max_width = 0 + self.data = bytearray() + self.index = bytearray() + + def __getitem__(self, glyph_index): + return self.glyphs[glyph_index] + + def populate(self, filename="filenames.txt"): + try: + with open(filename, "r") as f: + while fn := f.readline().strip(): # Get current C file + if (lc := fn.find("#")) != -1: + if (fn := fn[:lc].strip()) == "": + continue + g = Glyph() + if g.populate(fn, self.data, self.index): + if ht := self.height: + if ht != g.height: + print(f"Fatal: file {fn} height is {g.height} while font height is {ht}") + return False + else: + self.height = g.height + self.glyphs.append(g) + self.max_width = max(self.max_width, g.width) + else: + print('Failed to read', fn) + return False + except OSError: + print("Failed to read", filename) + return False + return True + + def output(self, stream): + minchar = ord("A") + nglyphs = len(self.glyphs) - 1 # Number less default glyph + maxchar = minchar + nglyphs - 1 + st = "" + for z in range(nglyphs): + st = "".join((st, chr(minchar + z))) + cl = ' '.join(sys.argv) + stream.write(STR01.format(st, cl)) + write_func(stream, 'height', self.height) + write_func(stream, 'baseline', self.height) + write_func(stream, 'max_width', self.max_width) + write_func(stream, 'hmap', True) + write_func(stream, 'reverse', True) # ???? + write_func(stream, 'monospaced', False) + write_func(stream, 'min_ch', minchar) + write_func(stream, 'max_ch', maxchar) + bw_font = ByteWriter(stream, '_font') + bw_font.odata(self.data) + bw_font.eot() + bw_index = ByteWriter(stream, '_index') + bw_index.odata(self.index) + bw_index.eot() + stream.write(STR02.format(minchar, maxchar)) + stream.write(STR02H.format(self.height)) + + +def make_font(infile="filenames.txt", outfile="icofont.py"): + try: + with open(outfile, "w") as f: + font = Font() + if font.populate(infile): + font.output(f) + else: + return # Failed + except OSError: + print(f"Failed to open {outfile} for writing.") + print(f"{outfile} successfully written.") + +def version_check(): + n = sys.implementation.name + v = sys.implementation.version + if n == "cpython": + if v[0] == 3: + return v[1] >= 8 + return v[0] > 3 + return False # Requires CPython + +usage = """Convert a set of C bitmaps to a Python font file. Usage: +c_to_python_font.py [infile [outfile]] +infile contains a list of C bitmap files, one per line. +outfile is the name of the output Python font. +Default args: +infile: filenames.txt +outfile: icofont.py + +e.g. +$ ./c_to_python_font.py my_file_list.txt my_font.py +""" +if __name__ == "__main__": + a = sys.argv + if len(a) >= 2 and a[1] in ("--help", "-h", "help"): + print(usage) + elif not version_check(): + print("This script requires Python 3.8 or above.") + else: + infile = a[1] if len(a) >= 2 else "filenames.txt" + outfile = a[2] if len(a) >= 3 else "icofont.py" + make_font(infile, outfile) diff --git a/icon_fonts/back.c b/icon_fonts/back.c new file mode 100644 index 0000000..01cf90a --- /dev/null +++ b/icon_fonts/back.c @@ -0,0 +1,8 @@ +#define back_width 19 +#define back_height 19 +static unsigned char back_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, + 0x80, 0x03, 0x06, 0xc0, 0x83, 0x07, 0xf0, 0xc3, 0x07, 0xf8, 0xe3, 0x07, + 0xfe, 0xfb, 0x07, 0xff, 0xff, 0x07, 0xfe, 0xfb, 0x07, 0xf8, 0xf3, 0x07, + 0xf0, 0xc3, 0x07, 0xc0, 0x83, 0x07, 0x80, 0x03, 0x07, 0x00, 0x02, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/icon_fonts/default.c b/icon_fonts/default.c new file mode 100644 index 0000000..570240a --- /dev/null +++ b/icon_fonts/default.c @@ -0,0 +1,8 @@ +#define default_width 19 +#define default_height 19 +static unsigned char default_bits[] = { + 0x01, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0x08, 0x80, 0x00, + 0x10, 0x40, 0x00, 0x20, 0x20, 0x00, 0x40, 0x10, 0x00, 0x80, 0x08, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, 0x00, 0x80, 0x08, 0x00, + 0x40, 0x10, 0x00, 0x20, 0x20, 0x00, 0x10, 0x40, 0x00, 0x08, 0x80, 0x00, + 0x04, 0x00, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x04}; diff --git a/icon_fonts/filenames.txt b/icon_fonts/filenames.txt new file mode 100644 index 0000000..263a3b1 --- /dev/null +++ b/icon_fonts/filenames.txt @@ -0,0 +1,7 @@ +# Filenames for media player icons +default.c +play.c # Test +stop.c +pause.c +back.c +fwd.c diff --git a/icon_fonts/fwd.c b/icon_fonts/fwd.c new file mode 100644 index 0000000..5e5582d --- /dev/null +++ b/icon_fonts/fwd.c @@ -0,0 +1,8 @@ +#define fwd_width 19 +#define fwd_height 19 +static unsigned char fwd_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, + 0x03, 0x0e, 0x00, 0x0f, 0x1e, 0x00, 0x1f, 0x7e, 0x00, 0x3f, 0xfe, 0x00, + 0xff, 0xfe, 0x03, 0xff, 0xff, 0x07, 0xff, 0xff, 0x07, 0xff, 0xfe, 0x03, + 0x7f, 0xfe, 0x00, 0x1f, 0x3e, 0x00, 0x0f, 0x0e, 0x00, 0x07, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/icon_fonts/icon_font.jpg b/icon_fonts/icon_font.jpg new file mode 100644 index 0000000000000000000000000000000000000000..554520c2946da5b70a592d003df52e1161ee6437 GIT binary patch literal 32036 zcmbTd1ymiuvM#)Fm*DQf-JRg>?tvW$?(PyGxVr^+cZU!lxVyW%2m3cU=iGDFd;h)b zy;pm>r>3T=r>lE*+t>59@U{U!m64E^0Dysk0i-}bz}qGsw78qODF7fXO$&epyc04g zfH*Kn0NDE_C<6N@?*qC72ZI1WfX+^!00H9Pb)etFfAE<9 zbO9pRzrVNt%-8$#KuNwW14IF^(9kf@P_QsCFmQ0N@Q4^lhzJOXxM=7o7=(DlM1*(* z1SAxUR3v2diGabu!670b;vga6u#ysxvi@Jw zTQ}eXEWig0@isVV{>51MQVC5RVFVe*o++l;NY>aad7cI zQc_XV(6V!Ia&hzUii(L#NJ>e|sH&-JXliNe0Kb@+el;_ccl9P&Lh zEG|AFF)2AEH7z$Uzo4+FxTLhUuD+qMskx=~XYa4R{(;|vLsQc;vvczci%XkZ+dI2^ z`v-?dmsi&}w|DmskAL3%diV2R^bg1W7r#D$`~ruBgn)#3_X`Z%6%-&oKthqSK%)sO z!x-74ld<~4Vu-}%)bzlSv#DHQ8aqtFV^Oege!P5l?XPG5XO0E@KY8|Fj{V!OB>*A> z7^w0fJ^+LO7x1phl&j15=D1@t98TmPkXcY-FxMCHtl3EKNE0yPs)UDe@n1s0WUNI8QPGpLsM3Q6Y+7QO!505L> z%^D*e=94Z4d1CkUV^382;7{?RVAc>}MyI2kowE@IZb!$;yoA-B1Ud(uVJpVA!5dwF z!}9yW;y#ynnuXL$W=w5F{g}(@C=@O@fvOb8`5`_#rqwGy!g>2pKjb?{ zrl}$kXNapk{hh-o2GUpdoZAsQmLv}-fzjyOYV@Eb@SQ{>sk z;W1buyNl%>nVL632~1XP8x50%s&{o*lHS+Lj~K_pra&$8`!pc>a8uq=pRQYlqG!qL z#kSmQ&D%?+r$=89ju^lk9`X6l?P*wn2EB!Oijxv`1w1@;u741Q@+YYOA;6a__m=di z##mapCBIM`G$tA^`H{ZP$>lWp-#3OVW?V-$-}M<*u~z*=9>y3J$E3&iNDk|WaKygS{~3P*#r!Jq~U5%Sz6TANLlpm7k>D?a8pM=zN@ zM~ZM!B~GKZjpKqDG8zg3Hnkxpjth7I1r5Myp8Qa+G*(6}7c{9^ACyTi)St zu{?f@;=CyD^EoFJ_;am=q3$5&RXpD`zsRr|eAU17{ApyOez%tt*wP}QzsUc*Si}@s z`MPT9PQf{)XzMcXesvdO3JXhW$8v=XAe09xOHz2k&~jO~Yx|m_#1gimyWM|Dxpx?@ zuM+AF@P0XJm}|Z|94}g0Twc_XC5hA8T3KFj;>)PP+0P+#FK?xBkhrgQ_<^A^r5-_@ z8wU7a0yKuQI5?=X{QfKG2#Z5tg;D|0#}w52Yke+PXH*3V*r$8rT^PX z{RuJ?7ROLxF32wc+0%gRm8Cx+NWYsfe8fQf=d&R}&jkE4K)k;w|9>wDTpFAHc<(_4 zw%nyej(ySMT1QkCWe{U78nyL?li*sSzL!^^(52MF=bimbp*KL4{32sl$YWBTPub-g zfIMmxw@RjV_N=meYR?efjdyOfe`B6`0KL}LS;B6Fcf)@W5;>9U`6Chjg3x3;LmNb3 zj`SO#Ps3mdU;AbFdGOvh)puw8Idu0ikK?dO=hvXsy-O$hh4XGH1hpBdC}}i7&37JW zfP(|~dDt&O0l)26>UBgrmcH0Gz*cFZ)bN)#0LnFuxIlgv@fG*Ur2ar8MQztbNYJgP zH(9TI)@9|d5)-UG>!>h+7hg6#PK%`)1_TL9Nx6vzBz=mwIqqM|8SHf_eP@bmh}CCONM(aOu2g$ac*X5tsji>ecp#hKyRG_2U4DijWM zm&Es^Bowr0i*MP|jb@Ld5XZ*_Ga6Ku?uUx*QoQ(XebpuxsD;=PTW3-vh~b|`5y8-*b~0=UUn2vk($ z7Z@AqCMC>D0eS4yUq6?^8QTGlBM>^tnv9yw&@cm<4jEk5(&uX#K z(#)+i%Ho)xFqG5gr=NK|y=|JJfKAmq9V1b&;<$sftOG@#%{h}cYhuN%Bk`q#uGzJs zx~@*`-vIqbjX6Ko533PUW0A_3Ka5o7bMpsA?0iAIg6UxVf-PZ&ldvV#k6fK zwJmFa^5TRUU)Y_-7`3!Aind-CR2}?DS7%g%9PZoT(6)L7s)tZd>n`@=M; zE0DE#j4thxjrCY%5j#$}$p1^_2KY~=WNwIvZEha&nW?PC@3Ok&zI_Hzm+Cp*3ipFE zVe$CK{K+ezp@P2sG4TC|GDzV!DOm)6JE9#r*9SzUh)& z*>mS-Q(+6fKN`075qZS@D*$}p5_5NA1iM$+dqC~th;GG~PUwmsdgyLjp)KlYPLa`U zOuZWRS$HEFsGFSAE}1V|wuN4@+^n1OBcjBu8juj(HWT#I|433*N092lXbS}?Kbc5$ zO`FDXUmSNR*H4yv->m0W0O_-vscX|EVQgf+X5t7~E(!BBm|R4FPEjPZz)top zFys1wWvqd4O14;f-6oIe7RmNkSos8hjF?NgOJk3+0L%~%34uwi{aW!G0C?nkgWUE8 z=t6qMoO<9{WPi#K#gAqylWihEo}DP@S=&FEd#)a{K`C%hX#19-A{Y)AuUsL*L6FuJ zyH74ROG>6*(=L+DY>$rAe4gP_F)Y1vX;PoW6%0`M_-UN(+i{Eew9D2bcfBP&eM#*WBAcLmcd{OwUxjmE zof}_v!#7%x=50l}G)zcSuOaFHC*EbB^i@Y)S z3trWA>ye~*+0-8L8MA=1@o1Lo#I$Rms_3^rLlbqtV-{6Y354B)zpqhWW)cvx@5;)DXkI5APOheMx)((}8q=at!qOqjsy<&4Z zUx{QsZnm2Bm8;EuKKbjz*F*P}}P&^r=wryMGGF&LV}zHSTLv?j7s=}{sa*jOmud&k9oIh7{nGymmS@u zIVlw1v%=1%|DbHiy;saB_5OpmBo!?&jjfv0!&p^hoK(FkLd2Z1r(cn|O`2Q?hC3z> zwBQZuFLArqr03#-|IV3j!An~uuEY(ngYppi)&R%h8yT>n`}s79GJK4lIVM4f<-|U_ zzuwFIA~Zn%NRT){|Cn6*W7dvQ;21eP7|sE9oZHR5g_bL~r$Qmo97|?F8^5Qe^=e=f z_Zau6{?x5y1=-H1)sSe3G+B&Il)BK*BR8WH%Y|2bH*4E=B-f&2JgzKYXZD8`)JO!J zJjfuUUe9^_t?VF=&aj%5!|D|a&RU{a3Bv6$J6ILz4et}M$Jt>NI)lE_N!!GX*9uFh z*JPp=pv9z(LvpN`UmwDLFr;_);-(!-6kIvp>P6;$e5tH4aQ&qKL5p#pwx+&|+VMDI z4xe$JE@NYxtYt2;FOA{EwF`NOGH~nB#F#v4h|&s;`&v_gF8PvOQ1d(Et{x6!J{L3L zQ)rloHk^QC0Ppp&K1zU0G_2b?1vIah+c>C0N+7SFYv-W&Rci6aqj({Z$O{0pe??UT zaPRDAOlKtllOov;`le66L7?C~^+KOMzF1@xF~$~{?^zx{nUQPFjvWusOL$WA2zY9y zx`l7eFqm0;377#*mBd#rNxoRGM1Er?x5cIEYH%-jE%7at-&C81jbuwgVo8=ESxZTmp{JCNROKwNb?i+iuSET>VcUI57%T=K4BlFlX~=bK$@AeA%E z<1|d{3=s36KZ3e{LZ>dQ!F*J^&U3(_M=0=_O`z^PKsQr*n=f=IwI5}4T+zTX`w}JD zzUZLI<*W*}PWLNml-S@fBMLd#eCz-}QA5F&K-Wb@J7xrEJfbj8e6yh88)DQjN0uz! z?#uAo-6~&w5FJ%e4)LqcEI|gM{mi_$JpB`{w9a@!jUF%D*3l; zL@waq3jEPv*j>55kJn%6eB5)m;+$YrRQ2yJYyG&?=VWE`Wzon(gD&gS&wbiO^2mzd zZQOn~U55tD9XFSHi37yJ%Ej8Rc0R*xO$E-Kv{|l`Uo|!0wH%D#1uxF^R#)>oF)uk6 z(WKF^*U^brQ-M57+m&Dh_a(Q!7?~PBWmT=oY(Kkl^n7M^oCdEcf#Ho!&7fQ+6{Pz}6vviN+c z8d14zSth_v=p;D0(Z=Wg<(oXm_DcRIlM!+75PEJ1hw1?XwrNbRZ%r~BmN+IsHn#L> zIKV_{)<)r_qTCGRqOiePCi&eVvbvY7MgDMS7Y#Zbift0aE9vnL@uKxrbInVGMH%Df z@4Ey5`+mO5wWfwGx1@>Li-GV4Vt74ShA>^3+6aEl4`-?o8yCVjg9nyt?KE4NbbWXp zA0uaL_49G#*0few9i#P#0&_U7Uz>6x1@Y;QHQcRijnOE+fs^}geXrh3bsOA1pyQl7 z+w0$Dv}XL+l*!hpm669NfegE2Csk3RVLywjo`+W^Kkjtt8lC;~mEBwLbqzlpt1(Rd z%6Pc!MHZQ5p64{`cFuy0VL!;G^2BtypgwEJRWphc7Ygot{n(KG7;mqjYK>v9%xRtr z0qqxs9oSL_Soi*sdzlW^cjp(r7YLb-)~hp7(K|8YLDCp&Au5pp0sE}P+$wW}CERwQ z=D1aKGiip#(2BLXKFs>Y{t5Q*%quL3h4zaD6~_Z4^^1-vZMQu6);O~qsY=XtaC^I_gh0*}pxM~ek3^FA-=|Y8OFPl+>1R$1s@~(`7ZhAc zzBpJsv1Azyz06LJpUf8h2dn~wc<)|BH3CJXt2pSM5X=z2=d3~RY_${1&R6BO+Y*qC z+Iu4(d*(+8CqN5?(>yB7_Nezjq7`M?@pPd+WNTi^AFW!=Ez zD9}y9YU~VQKWL4YKk!D_7)O=g8YQ}Wr7q9$(;p`AJhdCiQ9I+N%Cdh@*LU4Qj^C6* zL|@Ta(JvOWw6y&EMXz#0VGjalz-Ox+Z@w>WH|iU^rGUiN((s5o?&sK;&Ruv>RCgRg zB;&cbD(|?b7<$Uq4&-?0*5=uEPogTqc6%@nros<}Kz~U8)S8!B;sVF(#^X>NREM1% zr(=B#8m8cS%ns7Id-VV*b-YgnBt`*!f|rPbha2{5EonQ7X$q2Z8m(3yD80k7>2Cl; zx2dVIHR-dD)sZUP{j$VtQ#BRs=-aw{-&z_coXrYD{UxKI5sPYY_F8^3Rx-%qyYGIl z?qO-sdsXM2y=9qJejjF^zH*c%Sew&5zX3MbWU1yax{jh&+Xc#wSm-Q$;N}ZD$cHVD z?Ygt?R^bUxc*aNAy0^-*L(m~tciiIFUnv;g00VTfc>RUE7F@vB<)(+pmzq-F37PBH zH$cD4czBOLhTPRH=S5vQBT>bX1HNX!6kt<#U zM7RE~n@o6y`U0bCffb|t8TD~GQra~GdK!{k`36=Xd066ip zd7o0yyVNxq^Hl>Nxo~1wd7nXO)mpIR|w(iBXz`-oKSb}1qW?4G$%nQKIZHYwk zrgTUezqGvt4m7Gjpv>fcWVcRAS&?b%Fk+@9Hn5CD|7D~kj-*=*#kD}i#-uU|cT&OVbwO(FC(8{AEr&&2R7 zfF}v|=jHsCL_F~Uawbae*54!si zf4$~;Tt4R#kW!9__k(hrF)rxevX@&YBAgy`+!`eS3iUXGmK93GU!(Jg`6Qpj{sd%} z35)=T6=3ND`S%-d`H501J(4k6h&AmU?!U|@C*uXJBx|aqQpSd}5%Ey*gLM=2h6RVw zo*GBLExv7mS4)eE8Y-zMN=VCzgAgAOTJysSXzd8e3;wTfpc4|1)+eBy0|;^g z`wZeaU7hUS`4kY30W>rE0^-X-JiP-bgCKt4U2gmj{^Xti`j-a>u>cGQH5E~iZx|q+ z@LmTX9T5GyY#mM6SpSN^5Jdn0sI|AZ>yH2cOgsSa67%- zzrP3}1UUHn0U}7y0R{VxwL!tdz(B(y!XqLgz#||aA)}!pA%8$dKtRPp{eX^viHV7b zf{lZPfrEyDiSZX9gaFwXcrmu1hnNjGxYJ1d*0DB(}~nO3c*Bi2g2rRVt+ z@6`JIbZLKC{rw^d$XfV40ud?S67Bl__Hv~luu6e$VScQvjcq>@GilnzaMo+ZS%Ayd zylkMd+T++<-9SM8t3o8h>Ti%)z$Z`yBG|xuu~3qQ>HgNU?l{m(q)hTx{5JwaO$9)r z{nZ77^aF#8k@_o!rSL;1Apt4>n?PEiLrihzm-N4df4TQNluGYX3ctSsPy|X06o2=Y zq4?Vbki>wl{zc$$QX~K{3V?oY+pJDjz0gMgGV+UZ_%<-u42Ms-E@6a^`HIeBojTeirTKiDM-p$araew4DI`Q zBJa|B?I1P^qKSIbqBT>+gv~{cHoohGbc5FBdmKR*tFT7pruoPjf3M#7?dj$6<4kC` zMw4;5`FybB54MBiOs1jY!C{y30(X8~H>y{egm*no16f6dD?U%)%68-OeBxK%<(H8y zlGowE?>liz_;(PE0z`H(5Uqh@vO{1?@RhrE!eh?}CU({?$^)yUfx%ygk*m@t% z0prtIcDVh*)73jSV)wi@eh_KEwU;e4SN6PnWBtUqSUhmc{StrXHBU2s=y5;(DXf`; zC>ra^n=U#%DY4C9zvQT;&L029r{lplZ{75G(8SmB+f%1L%IvkLhF8Y)olju zahK4a`7V6#mb&$`Ya#ZXTRNhTHx(XCxWzx$UQ$n=#{@ks^|c++ zXn34_WUf1&zGjOf_;l>6PMPPWh`lyGbQR95@=LDvj=tE^ThmsRIuh*bw?%VtklRG% zZTi$@E9Sv0cM9AXMy%I7K0n!{q#oeZI=;02Df0g_7Ofd_IGV2aI=~1T@=|u}m4+6s z+ZfMlVjQ0=3X@r#%k7x->^K7LvTe|Jv#3F;iG%GG|07ma8P6SI6OkXiEh5W zYnaxU&6QtO_f*F__7M&^(wjUPPc;e?ff&1RNHLSQ;He3>LA4o{- z(iIv5wNIqOIjR!5o2l)o#CB~ytXReW*z$YN%lfFK@aZ&3vncJwK6`-EYVpOLyesQ* zPTSg2JX?yGW=&N;ki(MaDdd+zz%je)GIapD-9R=YIeO<6_x2iDN#UtU#~`$vcrT-u z)7Jf(BFC;>q2=`El-$0z&2qzwn4HLXOm=g0!b$US++{pCH);&1jez_clYATbloFlQ znji&s* zDzhML{Lq*5ydT=F)UrY`tBUj(lNoS+`7KsVpqyX3Bp{y~&&oeGjE|DW_@tGW8Ol1~ zgMP$J8)WfPI=W%HV<>25$a%cP#}72<>q$e zb}U8~Peb@bKo%QsBUx}76dS=wP{(45?!z5>V$}F6mF&@%PF02drkLV0=QGbplji4Z z=05A#u@QFJHF#gl#W6mFH-JmG2`d#|xH6=w%AvPlY2s+X^qNX)DX_G#p-V7%c&y+W z6D>n4w756`7^Y?KaYZLYphT-DOe=YrY%U`9kZhiKD1H_d<(nMZhU+9;E~f z#Ploqg0y=8{4ArTwZ}%Qq(x!HI_ENPdU53B{-{x0XHu?hsY2&yrwvDLs=ZkU*n@uQ zYs#+bmNh8rv|RPHU*(h|5FKXQ+&N$n?2R=jJ=Il@-=X4pg8n2+6dq6T$TF-GJvx46 zvRu||{Iav`evgHsDj3|IZyiHt%>rMNZ9C-qTm4?0hR7%aPBc-F9Vg8nXB+u9EOGCE zQ$5dK*H*}RU{2@SZ~43i3+ik7vBpfwS<(BJgw1Fa@Fk~2?2FA)U}Q-$TtVeZ_tKv6 zOeA$Dq?~o&)z+vAP34$TphFq{8F> zGK~>(&@AGYb+k#xO1#?>Jvyb$%TiD5J2j(_uK7?Jk}b&4!8c=bjEeVtWD$24wLCWh9yT{1#X zLjC-TZjwnHhhOJsr+9uPS(QW+LAwYx;K_KBNI-=BIFpRaX#)EhenMJma1k?|&{=O?j20}?ThmVq)%`)SLbOQYb;>2VY zQG)%q-4u-^7}N~EuT&&-P;Uly3R0s7WWRmn^+)Aw`L=E$jSNu7>?bslD~sL-a~D-Q zF7qCPk3araqHAv`qF$ZT4E98D32|;OGPAUuBv#l+NrQA(|C$LM!3P44V zqAoCdMa~Bfb#YkKnINPxQ5ETZpH@+VF() zDPq6OSE~u@>YQ&{JfF=x}W*iwB_Prqo(ff4c10-mBAu2is2^p)fvXMP#58mX| z1r#)!YHklXg_4SzaonbVK;AU-ClQBBF`!>y?ce4dG!YR3dy*eRLeP7~qI(EK%IT)$ zeX>O&n^2IKx3epLB0TAchVR@A91!sqO?Rc>h&HF#Ko7ik(m66oSf z;#r0(V7~Iww+$89nDmCi>DW7d*BQWKk7Cz3{S3AEW1DbqU)_TQ9)>W}m!-{7+s!@?4eHq`*F5J&gJmrs!3D@#?M!mm(cQUab zY`kMD8!nGEU|AE7*2wQAC866vr!|*eIc{;NGXjqt#lxVARZ@DAhd(PH!-q^*adfV# zb=m3c8_>M=u?)AtCOwoI)nN$@+EUwV@_RpVS0AhvH|CJ7-KS}YdfakoS)W(MG)DyS zEpee0J~}m69&41zLFL#{E`F~&#xGJhiCD)jE=8EQBuRv(1 zEo>m?g5i;JFuRL5_pZ%cZCf3LD{Mr~#XFqovXbVS>4cr92lgYGl}m9bo#YFSd`}*^ zYUB?Fq*X-?%)JCXR6B?*zfaV+rB)K=NdxxEE17I*c}gtZ^Ca^OZ@KG!d!Ox?j0=Xi zk_z$=fnqKw6w$WC{5jVwm7+B@(wyesM+Y}w#;wBy#$om@sSHTZbPK7BOM!@C5K4I5Dh?hp+Cdv{pvd ztZj*@e6xa%c4`J7&Oc;Rja11FqnD2l6W`q*WEHZBv1-I>n8kT~9&#$N*pALBfC$uE zdK``woPs4S6;%|ft@h+#YA_A)lqi$V7boICD*i>iOCKOPTb6>HKm56y2OPFo?yeFK z8cH#uBIfFGy_1A>3QZf)qO(Tl5yd0cU!@xry%J= z+|_n_;*s-InscY%>rt6--0<|A6e&>Uczs#OJYF>=%PtI{E> z3oWa4e?H=%Zl(_7vCV9$MZKI`d4U zxhfEF_Pt`?z@kD)EFWj`G?lz=izB~SdR;gaX^)=%bbmT6%5ny-;Zbef9SBa)q`QBk z;yCG9^OzRR+Q8qhkpB=gZ&CVZe|aq@K-&JgXDDSkvNiQI^M`4Xxu>k|evQP2Za|m@ zE9d6y=o`RfwWwpRxw|iK^R-(=H@q4s&ZE;iZ)fffF#cg~X@5PVnax83eZakg%7JMR z6{QM{h+Bi%Y1S+A>57}7-tIp?Z8nq2p)@UAYfV_ zU0au~>PvY9OLYjf>lrT1&cQ1U!4CDv6a~5R{JI1rBkZk~Ytqq~ zz@;l0(-?1fns-X9JN0>7FRsY8ystc@xdLhusD0Yn?k$u^X7@`up>~vS(n(>g)dU+; zYb@EvNZei7NyIFj1mvq=U8A8_G?w7oUo}TLWRj3OhJ9wRMozW;EMnPPyVS8X+6xb! zYTo7|=fG!05uYwKN^m)Ga2Vl6PFc0YkchG-qW`s4IJqVk^eq6h+9bgZDzaHf-C~8C z4ccdoPC*XueGg_~KWn}I77d9_nTmL9yu}aG;8jv5jFYUKbqpm@DRtltQ8r8%2s$&S zxNKNCzYt@+(7lyAus-xE?)0>{tLq;L!{CD zluyz_Ou$bh=P94yhxigzSEg$cu;d4*oW-(8Tu1<}cNM6=mH9`13k3rQ+W7u=J?KCB zTVbOMGFD}knx07v5;lAP*tnccOmd}MD0UGwV~0x$U_d;m%N0}gtF8Mv^|!|bfA4Xh z<{GhP?xwQ7Y&ZJYNuTo0`~SvZd~=1=LH*CW{t^J+#91`#3nmD zQid9$hf=}+c?0BPZ+??kQEcFrdCZtgLuS?LcUCVhoFULgz>h?cFt4H~;k>+^7muE# za-iC|Q8%<~QQ_%68^kqnvgX0NRC~yGs<6xw_kc&ksj6)#l9_24oipTkq^4l)C-Mc0 zd$p2~UJb6=!zykVDI6-^whJ01Cs2!RU+e|+@o87tn~rPHsXgjf*yVs{(sJ)u;<L5_#e>J~rXQFpK8+phGs#tGr+H!DiJ=oPw5$fN) zOGkO;6XbF$Tt0WS8WGxZ4ZG@n%JZRetD+YIDY}N4ls@LvHf{NaWq?tFXT3%~JO-WG zm{{UY`B#!(P);?M&?w;#7*hrmSaLk4L^nu&Ez0NWuvErY^Nj!T21o$y=!-XE=`CP6 zjcrPgGXd-4pIvb^i<9_8d#gDZHFWW6)oM$uKC}=CNy5B5Qw|XQ1DQqU;$kH%PqUL7v^6Ja(2m2n-C8 zOfkn;_~NL1ov;->;A(m!&!(h48~gZ}ucj=rH3f7TsUN!P-%JZ_(%l;xs!!U>b@#M5 zxf#=w0&?!9P4o!wbyjet?{VXrG&>Np&v9f-Dl*seag5qQFfi;xS+(N^I}v>0UP@uC zhqBCV=&Y7SYuB4cC$pVfO)}&44tUgZM)A9r8S<-3%&kLrWbqOXX6Cdx zPFzdGm3Q;B_NGn}NGNJ5bY~s2%QHj^>=qS0xZRrpjk|we9#z2CV|Ar4-?>r~>D||T zo;3H&i@L^)V5NdbWH~rk4~WAl+U?(%u16D8>n5W%Q!_~xHB7GXdm5}VP9ov4-#vzm z)@PULzMC8x+j{8X#ZS?Qu>SC&t8PAb`f&aBQnYBm)aba6JL^;r{&o#YZj&;UaW8FXN#A*Lv!h_z1m7}ICie$UZUww(%jFdMjFhv zm{yR@%Gy1h>^lA|c%*TSYJGka!z7TFimjko#^-b=M7}q`j3RcA*~mGFi*D*;9VKvU zp7~R~STDf7;rP7#28h)4{qpCJ=ioL6hx6pLXiZ}2kU4|IYwtulUDK=g^7JC+4-K8b zY3G54-!R%s_|diZ(nr~)^Id|Pt@6tc_f(6^e0TMk{fW16`H_>n+kNm6FV{<~c(`Nm zv-(~(Jl^a&WmT?(Lm76nS$aO|m~qm_P9_5)fj3qx#wUt(Jpepv4D9xtGhEd+SE2$A z+wFnh)IlHJ4<}hbmFQ4O;6@uovr%Q=Ex#9ur6`siE>j0D#;$lMQ{x!ccpXspNBL%w z&X(Cf*JaI`oux0;n<#jN(!SaZ+ zWS#H5%p8OiMD)$J6gCHHu(6HLp@@%BCRTnnGOsXvJ~&WrskHs5W0!ez zxVrVDMxFtAEQ4P?`^L+zDLHi8C)HqK*?p*g8XXYtD-xd>;_8s0d>ZpUT!1&`2#LB? z9=KH}@Krb9rfGq)!0SKi_W+hrIKQ-*Wv;uqoojHZ_vsQ!LVcweVkc7bi%cV+rOw@3 z9hRjcZd!i>%mqtnF`r+m$_+x})756~M9w6xGe~sh)nQZV6}# zxmI2GMpH21oa&dDi?VyQ_&V*`!mG(=&82pqi9(uNpe_6X{vbRHBR8suumJ05caE@> zj~%a86suIQSRpo| zJ421ZS?{_@u7b%3NqJ-mx_RPUf|5X1Rcr2A#1ZezPJ|LsR4tzK6gPAw583jQi-&0^ zg5FAFVKW~Sr)|emBL=|i$F!3qBmeZ-J$?K1eeD?@a6gQu+LZ|GgC4w-CXZ6o#*WZlqA z*8VeCJ4i`y16N&bEUuXLkan6s~P+=%JndSx^1tx9I)7V$j&6>+!E zU+10;S6BGhKowgXUseB`UTz7+N^+yWB)&1W7XN%mzpZ4{c`5qp&Cl}&cQO6X4f7qS z?F|yPvdNOOptqfUi&bRR#!{4qxWVtPimCAy_y7~|B(gjkyFm+N| z^H$R4s+DuI!`}d)5ry*m7lPpLkRJjp95~GT3?8%$`vHIkg-*(%jEVu8!W)6UpEI_P zt-&N=7XdmrI{D|+LQ`;xDh0$PeB_AF&FcZp?wQrzM;71mFaNnx3oQixQfTcQ#BcS8 zn?%}I&SG}6N+0D>OqR5BakQ1M_M67SsA+GS4#u`^`5cXeH*P^_p1;t<{q+oXZ%Xi!Qc@}ZpYFZUu zmjjeGo8Ajkd)~TgZv2sq`lc_9EnQ_8Wf-W^^ts$Ssu&WOqV3@vb${$RBiQTJW?Irf zA3Whn*X}sgne-t}{i;xlBvmTG|H`#MacJ7K_`NMiaTVpryMfhIM}^2IP=3f21Ux663kX^+TxjfI@WnTw<@5vYe~k%1-WLtL9C`aGEvdvK#)bngx8@SJymh_j~T z1QOCjcYH2)uXoh6xtUqi4LtdjqL#MnO|xNP{iSAytGi^LgWgR|nUR=;#?@gOi5fW( zsYX1lJ+8!`ewrOwWVyo?>%=RyY{R>mJaKKys-^`bB%WkvCdJn7E;qO~Qn1W2CdJO= zR!WAeStz0XdctOoj zA#25)e4l9(M=B57^>ZoHa->aMkdE){RF^abekgr(?E=yMbY-Y*#7*391XrRYp$bdi z6x-W@n}n~jj|6At$O@cwF57~U{>G&S9R#k!$-^V3_r@~r)0*t2Bke4?of$wG!`CCl zU+#E#+;Ug6d$cH~9GGh6`4(>gU4oYF8Dh$fn`-hO?oQ6Mx8_@^VS$}biUhto>b@3s zcx@5|-i8AuY3`0f_tm!^0tU6AYIQ?3iLerL_->wS_Jr((5gb|0vO!z+CHlBTF>rO6 zmif`z>&bOk_XQiVr3-2L3KEW~PF^YK2_2eeJNAq1B&_`f=q)N|% z=N|Egu=%+KAtQ=7?=F4l{c{tvFEt>y&BUdGG@704w)UOnM?-k>V41L{fU2Oy1s83 z2ZM6D@|{tEZ1UzTQVx(Q}t%)%eZQ3qtwcs7FhD+ zFq&FYRNO0;(xQlm&M!pH-vI*~^J-x~{M+oXZ=PnfAyveg0<1lP;Ze*wx7S1Sis)}z z+A)FxO^ITwuV&}QRP_~d4!6@8r4?<(Th~pAB&z9cO%`DC*7U5nlcLJ|zeC7T@jxa+ z81Dhw+SVkM;qw!nabqKb;DVRK0FE^0-E1;fvDMg?Pd_JyE^1CC8j)1LMHQlvU%1;c zVR?2Mdv=3L>dW0$o&mX=bGlfn!!7?7%z7xC@skxJXqD!Vw7o+5q8o7nPK+WVxOuRF z9f$USn(f>M2LybYw}GiUWvCRNC)>p?nkczA$;xjldofa}?QorM^x7h~o+;5?c&f)L zujG+*N=Y&)zdTBW!KQ6iikJm|*l9-&E=l(ZMIIq7jlG`uG(9VvbKw`f0kHkA?LDQt zcDbKdgvPjaxU6Ps!404VV5%4GGrikenY;UmTqw{j&Nv#aQ(Gloa|V$TTLWv_o<~Ge zP}y7pdpjg3hsr&?lQ*vws75NGni6e<#01(CuN4e@Oo3VmNxVN4CU`Z7Dy3%5=%GJO z{?<09i4F)jO=JY)gv^pUGzZQpQmNa(_}Z{XiVE@hSlrEv@IrU5INe{V%8}8D)9LCJ zNQ2)|G4xZD7J-x1$JUt5lQK9?t+|}^hnC0l&CZh7*GcK6(z{p#Pjs05 zWK-Etw>;tX(hpUYFQ*twvpYe1Xh6&NaCrXVQ~bQ+(wUn>o8DV4KByF!*VTnr!Z=aG zTO!ryX}h@iyLL(nm~g|$O*Ep`11W)%%n-A;I7y_jCPQ4L*cUzY2Ed&!TFqLw{d(!0 zk;X-xzH!)Ma-|5_jZ2B|mD*gD8aR>GU0C`9%B@sz&KB4zio*VFnTa{+CdKCvZj zsrYl;5rYqoTVZ5wB2p@WR)miXqh=FtOjJil(k+2GXoj&e_z=a8d96#4)M@G5#t67I zj6yBshXDyr;6G9PrLfV1L6zt;L(vRI58$fC7Q<&H3r zigE=NQAZ6Reod}SKWMGWM_tF9H3F6=1tmS6lW1PcJLk@Drfqr!XgPRs+`C+&#nJx{ZQ5*E&TW&@2s-Zi_ zw5PZdlWA-LP4W@)Ct0dqQIuK1Qje{YDPm*e2Uex-V|d7D@8iR}cHDx3JsU*k-2}zG%j+*e6_j8t%ANA`dC$ z_(=5TeZTdmoI{i3ilS;rZ(PfOjRh8ndxjM0MR;;9Y_!$5^2xF+**`J{YF6!|S;B~N zZ~CkouxHPGd6vY(Ar(2O{W_SmT~K?se7sY%^h)pU{py2>AZU8hcJKbsvD47pg_0dr zpB0r&oE>s=r7*cWY;t7Mq~=Z$A);`y?OTKymFkd0sMol{A1Ap!sJP7#V>9P^zeUug zbz65qV9!u@>Nq>Tb8npcXIQsMd!Q>WH6*ihO?vC_A%r|eBvbaB^W=}%-AhJ5(x*gb z>_h&REOA{hqbb6aC^Pud!72Dh2;J(GUqx%|(t^=WM*nV4pIqbVk2 zCvt%{D>R=7r5_6T3m)}UYOtPXx$SKb7pCb^M0=p|y{fW=5J2z0NMFEl+}7T})7|S~ ze}v_7Z{d2=6fu1YLvo6gSdz>u*;0P9X{9@c0xSic_UvfllrZQ`$q z_Hs)V{$VW58ctp7|F5fWimoJT(>}4;u{yTxoY=OVbWS?9osMnWPRF)wbZjRbt0&+5 zGjs9RUES2GRjby1_rr}65mBO4%^oTOV?NDJ=G>5yu`*@bQnHoD!|u0C_AZL)!a8ai zO}>7fIodL0`oltT(4olLnIfmTY?vfK z*7-tOp!v@Tl$KU>unD36J&a}P!3`(MF5xysOvTlmBuc@Ey4wp`?A&e__mhI&oYH`E zf)_^snbFDJ$(2oxOTNT0=cJf+ro~52jTCRT^1;(fTCjhi)!E@c00mB5R%z)*>MzeM z#l1cPR)?3)v?+pUxv}rTmdh+y%|llQM-5`2)0H7&?{v=1NBnJ!uL<9NKiZ~o z5ZZQfg)@gyJ6BdJfiC9Cs`nUGu+=!4AW!a4B8gkXiQjGgHGv9Js3O$UZKH~~8j(qo zL9}salel3noW$3$jp*uX-3=bRQ$|c@Lk$rbK}uTy>12Omn=>Mu^5C(A2#fB#3Utox z>Lf?nfp2mHHpxyuhh#-g$-U_3bZJgv;Jc^gzdr=OYt8%d`=W*2gLHWIoM?|WYN#y4 z!I&~H2X%NGzRAO?!xQC_t-0AW-8$NOy~r%|kza7eqhmFb=Xvq}WgU0)t(>y1zCPie z^OOFR#8W(H^(7l4w1GeOB;_mtB39Z(iBMzpMNP1q^YS>M*O9+@$yX z=2j_NZ??uwBZ%Bmps_NB*GcAZlqJ$@AR_i>dc5lskh9Q2y^o`9dbGDmbHa@&A=_nJ zAUNw9-T>=WuSi$>36OF%g0oCe;v)tlW#$HUN~t2 znd=hTA>GA2+C*V@{r5ebuP^Hb4M9UYZVS7`y!a~DS)bi`%-CRlg>AFi9FZZ7>-l~^ z1XJ)wpta|y`Sn2PYUI9iUOac`FB`!VVN2sh|H4VLdukP^;jF}teJ!jR_fKR8eu}B1 zL&0a_dklN(e^$4+CI+$Jldj*sCHGW<-3MPwDs`dH0?pVwCS|XOJ0yLbB#!3B=*Z>% z{3_6m5k$EE^Sy!HsRO%;)6S9t?zF)lA&n}GKJBK)Cc)GbnxBhV={Ja-SW^>ZL zFAuIN+y9Mirbkuf-9-@Zm@5MF%|XeJ_EeUJTky#Cw}9Mrb% z0e*C9;Kfd&i{Lf z#|dPn%`iOtoKR4D=PXZ`*@!#6Y4e@|^A8Z`@XGcNu=dk8`ukDl_d>~+=8=;PKhD(; ze82zP+r4j?&{o)uos#8{x!5|pnv|5Rxy-Yt>^k|qD=hfE!f29FyeIy2KNSkwyBeCo z5^DNyW`h>>%PHI6|CXf73U|th8(Yzmx@-5XmRa zKEFljD`^l;0pop$$U5cF&UVcG4aU~zP%w7uJ)aaw5=9hvS9o4AfBL$8)R}_~qOB~N zrC9~w=x6i~k!qaJto)>fwe-9~+yYa`_7gF_F>N;wr5ThcIU*PMpeD#7^kqnkC>6pp zNiu6L79d|J&d6qrnyocx^9WH+%dDvT_6l?b;jVOQA@3*XfY~NDlIn&6+Wv?=N~$V->6`^ zX)~VjDSan_{{XM5(jpRhmMhfTL!5ZC(DUi|h8PH9PGjgcSc|Nx+>o<8h}k*}ESxjx zERqzs#8wu;Hj18#%p%%J+o*%^UH!D<9d<6%Nhk!k*!6tHRfXoE9geYMT8U2|LBibY zu_t6v_Lxh4=3at|Vt%^c@7Kt3-+6tUKGJS8GIDn_a`$re78hTOnlJO?@OV3V$`L5p zK{#vrhb~pqYm>+G0S&?SRHiFaQfy<>aobmm^l1*$c$XrZ^p**}7THZgLP7=6He_t3 zI+Fdu6XX;p%Bp=icS&VEzFE|)6wit`GbMfzK5T=c+q)}l-C0ds(?A)c4wITlnrzf~ zYk80`Nj+l%9nv|9NWuji>a@iej-p7WcpWj}vbso^j%XocahV)$aiUXSIv5-(YG&tn zSJ)QK(FjfYp+>lcrsFr(KS24HKTpR~H4O)(^MIjh$rx%LlVotidF@_z6`aUAHc&(1 z-&9=(TXle>&6JQLhWLt=1dvmQr0hEdh@UHOY}UCTJ~wCvBGbvsk=$eOs?Htivs;uuBw=5VllK zoKB!=z>UH(tXiR1wi5HAZd2)3Pe*XV9b%`#LbDEG!FH0eln)$@AtJ{AwL338vrsRx z^aO+s5TX3Uu|V2SnGnCm#1hL&k|y)^q_^u)qFqocoepLm{KWg%t7PZtPNPOSr=n*5 zF>HK_IuX~v=3;iRC~nxGGH2Ux%M3k9%3M6)n5aY%Xf~*ieZQJSMG1ou^`pQdelm)2 zcUaY*ZX5=3Jv0Fp8?krx@I*w6kuqshaA@e8VcM1tGU>sxBXHAsKBQDC&BjldEKF^o zNz`tU)!>9K|IfxRn(5PgX#DBR@B^Oj5tKX2QVfBogc#*F^eP>nH_nytkeIz009S?{K6-K>uGgqZ{9B?|ESA~DU= zo>W?;|Jedh#TS)Dle%+hWa0>n8i%2e#tU$WdX33{Ha{<(Fehaa1uh#-2JJ3dyhH6Q zm2N5nq-xd|X|vr906rpC|AJwk$sux-r)+Dhg1$Y$?4_bmPkr_3R zVM8BaRU;9^lX`(@XkvkH8ZrqEkwr%{7~M;P)psLM>~t#ECG&Ptv4Cx!vb>0agP^p* z;*y=>P4?j_b20DdS+p2A5f{xMCA;lo=Hhpwf(|JprS@I>?;mu%^FM;1vm z%U%#-S3=iqwPW`psHt+U7WtVOejRjio-ltL zqI*Lm%tBwu&UriKaIIb@2gq!zesET7#Dw-}gn5T+%0TH2;x|vXwUiu3)}h3Es-Sgt zSyJa@qToZlA)H}L!@vZoM4>VD8xsrW3+5@ay+D?H2153{zyvTm3+l{OSvFYk>Ja`P zxUgn2#u13akfEFI_Qy)w1*M1i>@mvFmQ(!SBQssHr4%z~NpP~nQ1a!*14~4Q_{ax1 zS#{0jMsV1HTBHnZ@}#zqe}1%6hy@7F5b-k+DabfRwX(e4;DggbfN!Am&37B(&zr)K zYqys*qea#h$fak!>^l4Dr5uNXSb&%Dp(h?zhYARKsf~=QJ0zKdpBVgVHC2a%lgbO= zv(Hv91fc>%?m(lA-pknHn`NmxCa3d>;Fw8vxCS7-?d)K<(G^@Wa~ZkR9>Lepj7H4G zV_Ot%&(D~bbSo~O!&m7ZFxZHnGc$KKV(S^*k?ps?>AgG0(}Mb)B_$ZHs1r;vc2_fQ+ZBH={?GRwI+*$t4AQ5dHpP86>_h2Q_BzOoL2v3rhi8L;TA--JrL%896QD4UP zy5C%(T-y*<&fOkAUn40u;RUo&;RyxaRRqjUdnyCbr3;YU_Wpo7x{Wqu*{uYnq@KL1 zWgKj%QU6>cz#u3CAEVzuP?+KfX@kPqNWAu3`+Q#&-d^tzwVlUN%crXew^>Gq* zFr%=rrkoDN+f!^3RtNuK=~1Y19^_lV3?V}rG*?5%$vlzKr~n8DgPcLwB|ShaN9s@| zPc5wzd$gZi^GS9I-ui%|_{NtUpq2m}jwsNvAw|%3DUtbEVL(=E2KW=0&2|JnK}9f3 z{GNUea?Ik^Jp=nBX`Gwll}Hq`v55Cl(n4u|0MTE5E@5Y$%pQUW#(o*4>(glUhOO`+ zJGqzdP^TiocUlDeSPR|~hESE^_yq}Jl<{MUSovC7IUPe!z7l+2`AlBx7YPMC7aQJb z4|QVbFt#n}${b>avO~G{J31v&!r0_JcwUD*o{AheHCia`)xK_-P7F3}(cZ=8mp*Oq zTt1#vdD?2CY6g+MY_}KTSOOmm98LyyMfT%JWB>-WZw`=VbQU&U#Une%))!;O1j?)1 zyb8rhH%Ym=FnSXrm-HBURaOS`Y<~x2$<#?y^AgotBb$LFGWwc59vtsA0Q}2{7;=bKZT$`Gz=TS=rhylfhrZ z{fuJV5mW{iyM0%;KjvB(@fP28sfkmP#&v!x>~q`Tca|x(+%L_B$qnxi54p3KltpHo zV_FlqN?7BTv&Ch4FZHDntdBrb>{43VqUF zmPbv4gG7ZpHg8^&Cyy&P`iia+qrw8vq^bTmd}a)h$4j#J4v_ate?85(Ibp=6C;>VTlp zT~2ApK3H_=yx)Nms9D0qUpWzJ@&r-G?yr)fbpQYxSf^ivM}9) zoED5V{uV8UjhHP*HRREpS zdXPFs#tlIp0%q#V3>EtVOpqpz447<%toKWS%~l ztbb3f`Rwv#+%RG`7Hj)J_o$XM#c^-GWhrkZ54Igyrj%PuV&WKD8IrNqv3;H^=S#>O zKfP=lPc<*5`O%fXIg9^{M{??MKAnY!qd@ms3};2Lz?UbxU$uthlDCm0cFk+qTSs-R zzivSZXzxGdcHfj)&`MCZ-^yhn1{AF|x2hSGzdSha`iTkk#R`YDn%6R_1#zX#nhzGA zFMZ5KbqLA`A&+iv^Ad&m=sde#Co@fhLr(6ezm^R|+IAj4Nzf~p^0%pmh`{Y9J}6ca z4Wx1}#~B6>WW1`Xw<3$-nR)^zvH!}5pnbbcx+}qEB{g0^xqgz8Pb>YT4TyZXe&>02 z6QFyq^4sZ&S@g`^Jszk9FTGQ|E%C!}7?~q5jUiyZ*S%|gNRB-knTsu0!X&Eng}K|f zwbU#O_M{4F-Bmrwl`tG=xv`Ay;`ZbEE@$6U@})fGu-?*srav$h_#u9B--}D`#-NmJ zg}tA`rX5>5wG*9y7Mt+o*Trm~nnZi-KXiTX^1QA$vT$H|;wF6lz~MtQUb`N%pJn0< zcI|AjB+~?YHLnb7GAQQSoh$|9gh_blp$K8eiRZXd)l(HB##B3g%|UX%1YZK2mE76x z{yUJ^$4BWeZzcHNlGhC`*h@=Vtj?${fiKe`P0MPT#E9s3vkjRU$~o-vK9Idu_C-rG zY0{uwY2WOQTAWhf&n%11z=7T&8>XvNsS)a2_P9*v`co6xr;jETOR{WOEQ*g|0g@q56 z%KVtpOLRPT?0m#*Rr^u1_(Bji9BU3#PzWI1(O~PYSS2TEt};Wmtyo5d!K$`F1(VpKF;plg<7@ z518OkjOJcF%JI{D?1EC4)Sgg#I}9lsMecH|2J%24FmoWWP~wWiqy5!ju?uAg904)U zB(RK;=VG(%A;J|TR3-ADkBi^SNa63;t%Y$hl^gvzzR z{bV^thfVc;`5Qr#;?}frJanF=v)&$bg`6)=E@GMUmMatIPOw8t)s4@$-y1B4*v9UZ z0{^3kh83ZPAU84VgsUh{kH><|k@vp0fC)Z@-G^dC6+Md+PLbcOC3rdlji|H-CKeQ_ zq$sGJ{jAWJ6Xmtg$2Hf#{tuuJZ^%i=`*xGlvh~|0JhamJY*EAu|L?Bp)+*aQM@b@q z??7PRb_8#&Uj~Rd`z?I;WD!j6M$CAW->b#S92`;mFe+gL*Cn%JsHcZh*S)O2rF}Oi z?eu|NqSv_46x?gObI!_xXb+6gen2Hynp&yha6;F-aIpz(ZsQEaggu|Ir~BK5(gcxv zV$?okOF9LqkC6UGG8v?oZ>t?#i4Ii^`hef1tI`0R=_^BVtNgNC>znPV3I^=R;f{+8 zTsNb8i6#Ez)KNAX>(6Pj1aFD*FvRE;SyY1ooV(%YzNAq!uXa-pVB6qE00brmM9k~5 zG4>9L_)jg#)&bP&g0r+rc`<@gf^ z+Y2F(4dkbV6I0wgtidb!8jIms#?X!T-Zh+DE2`rg7pPo%2`KDvuu%A(U25&jY zF!E>K*>YBhMvQuJZ2D1k)KI>#4MX5n(97FOAb2+XKrn;kO74voR+-= zzji}D3RcAnGAtc82@-tvF%q#$6YKx}qKze9iy^eZ*$6OUW0-W8znS*hj)5*WGbb{!#boQK`ZsiYx>(GW zh!O_(T0sH5iDX&crsJMBIFCxZ9fX>=8fwgN+5~Ob45kR2MXm~s(iMLR>eH2AO`)~P zYMevuE#6TjM!={GvIcj;4nRl&o$Ji!rLbrz9@F0|5KUh0sYth|sc%#Wvh4o>3|8%3 z;oQ2$Jiu37c;8jP5iiFM@aN|Ji+%#r9=9y7P!Mu^t^?ZZyB7&Y{Blr3<6t-nN ztW?d>77#is+$)HjT-MgcX`ECs)xA2!Q!$}JER^;`{{c#%v>xAl^(h)83=L&GJX>$1 zk6^$C^iEj80BE>kESSyRr{1mvCj?x2C*~xE__f{|2^$Alat^n(SXWrloc4y;xx9>M zMzF}hS<#^#xU2T=`;!HCa2qemU-gQp^pPmaCK)jbsWGmF2sDFmKamD_kqv)NcZY!M znCY9eiC^0N?E(bApgS`F%~Nzb4gkWZ^2#RWToVG@Iw1S#H^cP@9`DktxA{0JE6k7* zMWqOP78uy@2>>L9Kqz1D;rUy=ErNq#|2kxrGssn&>`VcCYt^jD058DXadp~lPwm4cTJz)6by{EO zn@v&LRm+<2Me`P@)sFKYfOu-_vQ3DVRqb)R>x9rM5~`uzG~bkIXG$;$9S=ZUt|fMp zt6mnX!w`I-RA>6PyS#K+?IwfPy}7*nT~$@@PsZM(+)`&(RR4zp?q0+L2=+?<1D%N}W4eT3%g+HwJi{gni!fA2s zU~66~E*rUrwU|7`(V)CIlCg~fgGzqGa?48LlO~l|e7%*!HpZqL_CpjGDE+yEe# z|3iZf2jAhinBLLY`64_#PnhH__rwH5OG``r*$CHFJtQtJ8RZA*2mJed{7UmlbDN7> z{#o}A(3kuE_(}G%eQGDFc@vB1x8rvsdADA@3u=;lNR)e4+>bpey^HwuY&tB2^V#5+ zKe9v4*k-*QY4C0c662xNFbwH_kuMKLd9-9>{6lU3_~Dg9w;VwDa=iMd;7I>NUPzW- z0}*=b-J`2s^YBXv8RGT(`{uG&&6YV9ZtoXqNXtsrI~0w8jAV}AC;W^GLk{VcJmJ>XYo3fB9!N9#JR}y@i!`G+utf}Z6%(qMM3^Li+ z?l(*qz(cE)k_Fk+(#!c6yF@&i1r1eV(t_hAMaiv+5H0JK0h1HLmrQ|XT=0He!GQRs zY_#djm-fZd{cLty8iL5VK_WP8zEyjbYT8E2;NTy?e&l;pv61mtZ04w#NHeu{3R0|$ z$zDNo%_M9-Xg2l_7_A?`EHFLKS%kn+;Ep%a;YX~*1FY`S#{z(?y2R(Cj~`fd1OsSRJYn3>`$czX!#Bw5GNte@ z!`h$ukC#s_0K)o2rt^>NXo)QZEelOt1W)-p8Zg^j_Ec=^Lpr%iU%N<3dK zXW9|Of+DH5WiV^sv0X%DHPXHdEeGru@FW&V}1NAA;vA{Vv;MuTV|kQ|dbm zS-ZY%xDsfS#}INcoa^VLhsq9F%4XF#5-6i(uBa>=ja+6e8r}- zOuT8?8J!>JK-+ZkLg7!99V?^th4cOjmwzxR*J1k8%OXwS)^tskCCs9lTbNvPmKE0Y zz43uniB0f^sk_j|i7Lg>aAW=k^-!HxqiS~dJ1W))|b|D3;vuN{D=#Vusy?>A!+Z-U!g_Fh+>pA6aDahFQ zhcj!QpDHKPvDfgTk4T6Y)p`@IKAvg=Z0k9*))smqoDzn=2^x8BHrsG8;l8)|`8p^8 z=fJ3u(t@O7BNx4dC%B7XP33qebpyidV`i4H^7AaQD5O|i($*&_{H?aa9s2c}#6jQ) zeUz(w#{-)<>35N@h9C)xVGXGUN*}oC1a~ys`P1>MRl9mI29*3rpTwCABV;>iy|>!s zFc|#2`|KiJdC&r)C@JLvmW>25gh-y1dV2I6jIB#+N{Ow#g)5h$=?r~6x7c)IINV*@ z4O)J71PJUz1+4y5j8mW-AD;*s5>_^+3;CfC;n!Z8oe&euNR2n@?#%a!KG*%TkNYZX z(-^nX#$0dz^jG z8zr;fWF=-gl0q>S8}S8S?xfCFY@QWTd^rsl$qDc-v}VaeytYkfAQ!VxEbUJ%kZ zMh=nW^V#zG7UlJVF$eY=g?@S*eMPudL*ak}opywz)Fj3ggo0lO5j1L)@&mB3$=4!T z9K&_8jbP%muGG8eWb>Oxay?Ih(%Z3Z0yff+_25&fz{l)sPxf*IPmk|ViYc~{?PRvR zgUMW|k0R46*Q;u5v=+y|J2k5aAIfAC)k95VTr9C8qAns$COriBuZ8Vqm~;t_LEyc! zBdOj007qkg)jO=cFjO|(dM1>)7Fo_;3wxQ&9t|iR4s&5BwljcK3Vt?R^3(4W^b^-_ zH&83~x7QE5q)jyb{!xi6{{Y_TQfVipZDI)n0d~pAU0YW65^k=~EGx=9O#;n^n={eLp_=N>Q+TC8#27&4 zB*e0MQ=C*_8j{@5{VD)nrOs{PC}f5Af5kux9=1IbItF3L{NbD#}{$BPgCfNP0HPmZvMzRu$B@ZacSqmBCSLjJeHdkj8D_wEFwN#9XsRkRbOoi-@X>JmB|cpN@)9>vgwPlW`RZQP(SbiQ?=vv<^#HOVsA% z;Qn+eF;3hA!ggGbU2aQ#Q!mF?XlvnkTyVd|>rvA7rMN@z&k4-h<2CDqK&|blh1gkX z0^Ip9xmpx93k&aH2%aF03uV>$#QirS`A7eh^2drpUK(-2%dW4iOHfBY-k6QgLT`+sG9ba zsQ_B2?vu)I_`2Yu<8xk~QASD-nqc6UIX6{nx=2WgG=*7jj4YKp{yV-XiIQ`(LbzFR)#Z6|R84W4`>yWL0up(`^LL;3PxZS5` z)FGLG!RXqsU$zt=c5YY;kB(@e^b4 za`rFbo^88Ydn(=U&DUgpQOB<`1HIA5Q$we8RehFQYPJNeqXZKq z2BLI8eI5bOCqbV$KUHgQ9*;LI5pPa2I|>P_K1OGk==D8}A%>M777sa6Dq>d3Xbq|? zuY0#x-vP4YFR}yOtB9e&{JZQs!T599bxg#&yyvM4M5l}4q$MGD)|s~mx#nQ$?{X`3 zR9bm_|5-vfL|0n1vI4cz-;3qSba{GJ&RW)`KW5}&b6$yPG*bS=w%do~PY0`9lgAL*Vv@P0Db&ifNi8&X7CbY(rWJe!6j?$`TGK~R z7qBNCXMDK6(4_8y{U;T!3FsKT=Wl75r4!;bNOMQTD|t`D6Z@9XZ`3;7mxXUzf?*nj zW&dJ8tIxdHgBxl{&pfeAao;&Y0CK`nur8kFcOLXSjg`EkV$)~gYLz{myq&b>4ep?N z-2HxJ;TP`YgO?gBz>#Lm0XHHuSf#-9d}2K!TjDLbN%@ra4`5e36JD2=d|diONasL! zzv?1)&nN$qRCAo}Zi%nK{hF#bbHuRo%R1AN3x@SFeMx~RG=0ly?m;;yThs^gK}gkm zY6O!fRlnFc^~OErR>1jsF;>0jg{d&?ch@0bUzIFIpkBk*Pl2c)e&u;&^ADgrQm&S& zGX59W@!0BtUtZEPmrZSe(8q$DYmUNCd$3b@vpa*NbLKBc+F{nTA7-1KhvVTyDx>av zES30M8ef|8p9vO5tIe@C^NCc|b(QA6RMjlmRHeyIF072yKPR78Kifi5eK69T%^7#P zo)`^fQ*P<&ZsvR4PWtIJxF;#3ankMS|yR z-gKf1q9hi%yOmItz}AKQUrSv1+pxfmw5#z6{~oq z(83pC*{`L)gW^Sl(a`9nxVWI`!1z747tV;+VB!gga%a6S>kpjJL5%7{fM)u_?Su-h zd}?ProeYPYvi!i=6f?=(UiGO&tUDll7J?jRSlj_tv_1RjB8mFa5KXP{s{mdsa#8_& zpeFdv>_n#SC&J^1zd5J}d`A8mP+dqI9xMSZ51z}eaujdpKDwxzTvClXC{9ez%Z3Ny zNSaVdcQhV?**Rn$-`+|YciP+CL=9Kgz;DRdw>M2Qrpqa0?Zr;Aa*r8*u}Ny>%QIs3 zML7^Fmx$jD;gI2`{^^Km#-(yQ8_z+kH-MnQU(NG9inX1lV5wFpROXABg-(vp;@G4( z<|3`2tNVQ|;mNdYfpNH@nRA3#?uwJO4b;*AfpxXhV@AOPAY?4SH==FE=cBl!3dLY) z$-2!a09yNag9J?EAZOGz+JMRvyCQhw{NQ>?UM)vlczEIttm5R}o#14JirQ$!!^bO& zOY@|B2kWqTf|}#g1RL38y-h$~7Z6WVWFf(|K?jU*ZZ5lN#7_fRstP531aTd*+QP5) zVNk4Q_R!0=?+s?q4#lK4fm)0d6_f|A4sZH;-+P!TFO0oFzHh>kQ6~alkF*W8Wl-?zLZ8K5`Y}t^a@xGIkR3%$VWiw7nUc{6 zLuCrjN6yoyWo1Dp={DZ0##iQ;KgyN)xo5x%R@FT1;1Z>yZGYzdS#SHMWw18h#1J(Q zN2L2;SUO1|jutX8;^KEHnT8M0sC`v=PTg@AsjgT!Cv0awys7J7ZtR&9w*BUV*=PG9 zG<#CL28WLX{SRP8|2y(U5_&lU#c@|XB4e{;{t+fK638U5_SM^|VS9@=QFiSi_Y3A7 z!4o2IpluiIrBDzoFj0cTefGQXN#J7zV8!xwMxKqIoQqN!1EVBdLvYyz$|c54=E8gV zL#qK%KToGgKDv9$I70%UZ81Cc$7`G=w0L!wU>Rh>Y{Hyk5=qtLXA(3Q&u#>dLf4Wg?UT2> zIl5}W+fB2!1-Yly@i7^U{wKq&(jpHzWj-ZRQ z_Gi2bg17#n!T2KCH(JH%yefa`-XFZc&?NTqZ2?|u?cD;ASKic|^vHy^+IvE+MIC)=(x`7Yh{>SGfu!#0Ck$y&TqlbdGh z0VHmTg4%JTt%|c#bh#cGOdz?uqmm)M=^+mer&kp04d{B#3?53`nD#YmPo?S(j=-6k zb*8keo|L4jQKT4H=0a5#8SkuA8cDmjNFO6pOp>+!s))FU%dnqyi&0hRa?p8YLI$JZ ztOF-*Hi14ea6rQt2gqG(g@x@%3zw0Je2{rdYGWGz=)T@>13v^+gJKIya^<1QacrqcnNP> zOi1t6@j3sca(=Sau&;|kx8NrPa}?g2w`wt|4|19tFWQp|*^IK`PkTq13$RYE501x>^UE_PuVXeCS(-}x zg(m|xungip{lUtNaFE19oHS*Ucj|ZJpyVH_`|1 zce-rX#0&y&5WAG^;9A`t6%5~-|1qz6A4t!6$N6V_9FCMw3#On=$2PiY?}D zRZqcK%239CRXj-DoOn1=S9M(rqX+>H9o;6Tc$ONfm2Z*-u1-BrxJpldCa;k=z#4m< z$T{Eknv~#}e*&It`MRKa($c;4{i)HTkCKi67_MAlu)GQ(+_W%=tSOpRZbxTAs$zP> z49^Y*nov=XmE=@U>9fsxU0<)5trTu6mE^1vhOdV$?Zply3R-jdVXm(3NBE39B|BJ1 z+a`O06Bt6F(`hm2L5x7c>`n7N@?CsQ3l|MiUahNcTi(M9tTWNx)(uff;%%pjzAZ3~ z(Avb6wVgxx9Kw1&j+;|3iqH_Rt|>k&zkY*3YJze-MBT9p_=EQ!VD)3j86te!e~{ zG|$S!d+4QB2U z@Oh)^9mYB#@@7|hC?zoWCb}CqUiHo@QyUpWZTO>Y^b4rf7e~Rp?~sQ^P{nzOy{E=x zxjk}B2z!USOfpjph&#_fSQlY=;mTUBV^-6ez?17&6`COn|NdmRRmC)b%5I}Aw&pgA z1M5=0xnU6_0ClA_`yW7YCqGn0Kg;~R_SNK_qLd|{AXKqVSR~WdB%}meI~+&mT%kWO*lAcRqB;-uO9N1s th*M3o49Iu2d+OuC8Wfsow_IVnhHRl$t(SBv%?h}iRl#g&wtoNC{tHap?6Lp= literal 0 HcmV?d00001 diff --git a/icon_fonts/pause.c b/icon_fonts/pause.c new file mode 100644 index 0000000..30334be --- /dev/null +++ b/icon_fonts/pause.c @@ -0,0 +1,8 @@ +#define pause_width 19 +#define pause_height 19 +static unsigned char pause_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, + 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, + 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, + 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, + 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/icon_fonts/play.c b/icon_fonts/play.c new file mode 100644 index 0000000..988cffb --- /dev/null +++ b/icon_fonts/play.c @@ -0,0 +1,8 @@ +#define play_width 19 +#define play_height 19 +static unsigned char play_bits[] = { + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0xfe, 0x01, 0x00, 0xfe, 0x07, 0x00, 0xfe, 0x1f, 0x00, 0xfe, 0x7f, 0x00, + 0xfe, 0xff, 0x01, 0xfe, 0xff, 0x07, 0xfe, 0xff, 0x01, 0xfe, 0x7f, 0x00, + 0xfe, 0x1f, 0x00, 0xfe, 0x07, 0x00, 0xfe, 0x01, 0x00, 0x7e, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/icon_fonts/stop.c b/icon_fonts/stop.c new file mode 100644 index 0000000..f07d42f --- /dev/null +++ b/icon_fonts/stop.c @@ -0,0 +1,8 @@ +#define stop_width 19 +#define stop_height 19 +static unsigned char stop_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, + 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, + 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, + 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, 0xfc, 0xff, 0x00, + 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/writer/WRITER.md b/writer/WRITER.md index 5f46790..268a748 100644 --- a/writer/WRITER.md +++ b/writer/WRITER.md @@ -369,6 +369,9 @@ Save this modified font under a new name. Then run `font_to_py` to create a Python font in a chosen size and comprising only those characters (`-c ABCDE`). Instantiate the buttons with e.g. `text="A"`. +Alternatively icons can be created as bitmaps and converted to Python font +files as [described here](../icon_fonts/README.md). + # 4. Notes Possible future enhancements: