diff options
author | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-11-23 23:13:26 -0500 |
---|---|---|
committer | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-11-23 23:13:26 -0500 |
commit | e5df1aafb6d1346207343ccb858fa373e6b86301 (patch) | |
tree | fb26f0091dda7dd69d48d6b06169ea618332b99e /SrcUnix |
Check in the Palm OS Emulator, version 3.5 (2001). These files come from
the tarball present in the Debian archives [1]. The SHA-256 digest of
the tarball, c5e0d23424e88525bfba0ecdf0a432a8d93c885d04740df06a9eeee44e5f25e4,
matches the digest preserved in the FreeBSD ports tree [2], giving
further confidence that these files are as distributed by upstream.
[1] http://archive.debian.org/debian/pool/contrib/p/pose/
[2] https://svnweb.freebsd.org/ports/head/palm/pose/distinfo?revision=271305&view=markup&pathrev=282162
Diffstat (limited to 'SrcUnix')
92 files changed, 23541 insertions, 0 deletions
diff --git a/SrcUnix/DefaultLarge.xpm b/SrcUnix/DefaultLarge.xpm new file mode 100644 index 0000000..acec0f5 --- /dev/null +++ b/SrcUnix/DefaultLarge.xpm @@ -0,0 +1,732 @@ +/* XPM */ +static char *DefaultLarge[] = { +/* width height ncolors chars_per_pixel */ +"436 664 61 1", +/* colors */ +" c #000000", +". c #005A31", +"X c #ADADAD", +"o c #082918", +"O c #A5A5A5", +"+ c #525A39", +"@ c #394231", +"# c #002110", +"$ c #738C63", +"% c #7B8C5A", +"& c #738452", +"* c #7B7B7B", +"= c #737373", +"- c #525A42", +"; c #6B6B6B", +": c #636363", +"> c #004A29", +", c #006B39", +"< c #393939", +"1 c #313131", +"2 c #DEDEDE", +"3 c #292929", +"4 c #D6D6D6", +"5 c #212921", +"6 c #007B42", +"7 c #212121", +"8 c #CECECE", +"9 c #182118", +"0 c #5A6B52", +"q c #C6C6C6", +"w c #52634A", +"e c #63734A", +"r c #636B4A", +"t c #9C9C9C", +"y c #949494", +"u c #293121", +"i c #087B42", +"p c #8C8C8C", +"a c #848484", +"s c #737B52", +"d c #425239", +"f c #6B7B4A", +"g c #424A39", +"h c #21945A", +"j c #6B845A", +"k c #5A5A5A", +"l c #525252", +"z c #FFFFFF", +"x c #4A4A4A", +"c c #424242", +"v c #EFEFEF", +"b c #E7E7E7", +"n c #4A4A39", +"m c #5A6342", +"M c #181818", +"N c #101810", +"B c #101010", +"V c #BDBDBD", +"C c #081008", +"Z c #4A5242", +"A c #000800", +/* pixels */ +"zzzzzzz11333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333311111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111zzzzzzz", +"zzzzz<<1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111133zzzzz", +"zzzz<<<xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxllllllc<133Mzzzz", +"zzz<<kyy=lxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxc<37Mzzz", +"zz<<:XOp;kllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllxc<<137Mzz", +"z<<kXXXy=:lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc<<111773z", +"z<xyXXX=xccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1111M3z", +"<<:yXXacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1117B3", +"1<:ptpcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1333B3", +"1c:=p;cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1333BB", +"1ck:=lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VzV;cc;VvV;ccccccccccp8kvk8ccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVccVzzzVcccccccccccXc8VXccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzzzzzzccctcX8tccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVccVzzzVccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;cc;VvV;ccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccckXV*8;Xpcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;ccccc;VvV;cccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccck;*;*;*;*kcccccccccccccccccccc*;*cccccccccccccccccccccccccccccccccccc*X288Xpcccccccccc;X888X*ccccc*tcvp8tcccccccc;;*;*;*;*;*;kccccccccccccccccccccccccccccccccccccccc;*;kccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccVzzzVcccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccc;zzzzzzzzzvtcccccccccccccccccczzz;ccccccccccccccccccccccccccccccccc*vzzzzzzzv*cccccck8zzzzzzzv;ccc;tc8X8tcccccccczzzzzzzzzzzztccccccccccccccccccccccccccccccccccccccczzz;ccccccccccccccccptX;cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzzzzzzccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccc;zzzzzzzzzzzVccccccccccccccccczzz*ccccccccccccccccccccccccccccccccpzzzzzzzzzzzpccccc2zzzzzzzzzz;cc;Xc8VpXcccccccczzzzzzzzzzzzXccccccccccccccccccccccccccccccccccccccczzz*cccccccccccccccc8zzXccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccVzzzVcccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz28888zzzz*cccccccccccccccczzz;ccccccccccccccccccccccccccccccc;zzzzV*k;Xzzzz;ccctzzzX;k;XzzzvccccccccccccccccczzzvV8888888pccccccccccccccccccccccccccccccccccccccczzz;cccccccccccccccc8zztcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VzX;ccccc;VvV;cccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzkcccc*zzzXcccccccccccccccczzz;ccccccccccccccccccccccccccccccc8zzz*ccccc*zzz8ccc2zzpccccckzzz;cccccccccccccccczzzpcccccccccccccccccccccccccccccccccccccccccccccccczzz*cccccccccccccccc8zzXccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz;ccccc2zz8ccccp2zzz2tccccczzz*cck82XcVvzzVcc*2zz8;ccccccccccczzzXcccccccXzzz;cczzz;cccccc2zztcccccccccccccccczzztcccccccccccc288ctvzz8;c;Vzz2*ccccX88pccccp88Xccczzz;cccct8zzz8Xccc*8vzz22pccccp8zzz8pcccccp82*cVz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*VzV;cc;VvV;ccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz;ccccc8zz2ccc2zzzzzzzzkccczzz;cc*zz82zzzzz8pzzzzzz*cccccccccpzzzkcccccccczzzpcczzz8cccccccccccccccccccccccccczzztcccccccccccczzzXzzzzzv;zzzzzztccc8zzXcccctzz8ccczzz*ccc2zzzzzzzzkctzzzzzztccc2zzzzzzz2cccctzzX8zz8ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXzzzVccVzzzVccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz;cccccvzzVcctzzz282zzz8ccczzz;cc;zzzz28zzzzzz82zzzVcccccccccXzzzccccccccczzzVccVzzzvVtkcccccccccccccccccccccczzz8tXtXtXt;cccczzzzvVzzzzzz22zzzzccc8zztcccctzz8ccczzz;cctzzz282zzzVckt2zz8t;cc2zzzv8vzzz8ccctzz2zzz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzzzzzzccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzt;;**8zzztccvzzVccc*zzzccczzz*cckzzz*ccczzzvkccVzzzccccccccc8zz8ccccccccc8zz8cckzzzzzzzz8tkcccccccccccccccccczzzzzzzzzzzXcccczzzVccc2zzz*cc*zzz*cc8zztccccpzz8ccczzz*ccvzzVccc*zzzccc8zztccc*zzz*ccc*zzzpccpzzzzVtpccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVccVzzzVccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzzzzzzzzzvcccpptccccpzzzccczzz;cckzzzcccc8zztccckzzzccccccccc8zz8ccccccccc8zz8ccc;2zzzzzzzzztccccccccccccccccczzzzzzzzzzztcccczzz;ccctzz2cccczzz;cc8zzXcccctzz8ccczzz;ccpptccccpzzzccc8zztcccVzzXcccccXzz8cctzzz*ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;cc;VvV;ccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzzzzzzzzv;ccccckpt88zzzzccczzz*cckzzzcccc8zztccckzzzcccccccccVzz2cccccccccVzz8ccccckt8zzzzzzzpcccccccccccccccczzz8tptpptt;cccczzz;cccpzz8cccczzz*cc8zztccccpzz8ccczzz;cccckpt88zzzzccc8zzXcccvzz*ccccc;zzvccpzz2ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz28888X*cccccc8zzzzzvzzzccczzz;cckzzzcccc8zzXccckzzzcccccccccXzzzccccccccczzzXccccccccccp8zzz2cccccccccccccccczzzpcccccccccccczzz*cccpzz8cccczzz;cc8zztccccpzz8ccczzz*ccc2zzzzzvzzzccc8zztccczzz;ccccckzzzcctzz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;cccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzkccccccccccc8zz2tkckzzzccczzz;cckzzzccccVzztccckzzzccccccccc;zzz;ccccccckzzzpcc;;;cccccccpzzzcccccccccccccccczzztcccccccccccczzz;ccctzz2cccczzz;cc8zztcccctzz8ccczzz;cc8zz2tkckzzzccc8zztccczzz*ccccckzzzccpzz2ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzzkccccccccccczzzcccc;zzzccczzz*cckzzzcccc8zztccckzzzcccccccccczzz8ccccccc8zzzkc;zzz;cccccckzzzcccccccccccccccczzztcccccccccccczzz;ccctzz8cccczzz*cc8zzXccccXzz8ccczzz;cczzzcccc;zzzccc8zzXccc8zzXccccctzz8cctzz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzzzzzzccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz*cccccccccckzzzcccc2zzzccczzz;cckzzzcccc8zztccckzzzccccccccccXzzzVkccccXzzzVccczzz8ccccccVzz2cccccccccccccccczzztcccccccccccczzz*cccpzz8cccczzz;ccXzz2ccckvzz8ccczzz;ckzzzcccc2zzzcccVzztcccpzzv;ccccvzztccpzz8ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz;ccccccccccczzzvtXvzzzzccczzz*cckzzzcccc8zzXccckzzzccccccccccczzzzvVtXvzzzvcccctzzzzXXtXvzzzpcccccccccccccccczzzzzzzzzzzzzccczzz;ccctzz8cccczzz*ccpzzz8tXvzzz8ccczzz;cczzzvtXvzzzzccc8zz2tkcczzzvVtVvzzvcccpzz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;cccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz*ccccccccccc8zzzzzzXzzzccczzz;cckzzzcccc8zztccckzzzccccccccccccvzzzzzzzzzv;ccccc2zzzzzzzzzzVccccccccccccccccczzzzzzzzzzzzzccczzz*cccpzz2cccczzz;cccvzzzzzz8zz2ccczzz;cc8zzzzzzXzzzcccXzzzztcccvzzzzzzzv;ccctzz2ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccckzzz;cccccccccccc8zzzv;czzzXcczzz*cckzzzcccc8zztccckzzzcccccccccccccXzzzzzzzXkcccccccpvzzzzzzvpcccccccccccccccccczzzzzzzzzzzzzccczzz;cccpzz8cccczzz*ccccvzzzv*kzz8ccczzz;ccc8zzz2;czzzXcccvzzztccccVzzzzzV;ccccpzz8cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VzX*cccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccckcccccccccccccccccccccccccccccccccccccccccccccccccc;ppp;cccccccccccck*tppkccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccckkcccccccccccccccccckkcccccccccccc;;kcccccckkkcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzzzzzzccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccVzzzVcccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;VvV;cccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1ck:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccccccc<<<1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111<<cccccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccccc<13333311111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333311<cccccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lccccccccccccccccccccccccccccccccccccccccccccccccc133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111<cccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccccc13333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331111<ccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lccccccccccccccccccccccccccccccccccccccccccccccc133377MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM311111<cccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccccc13337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM1111<cccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lccccccccccccccccccccccccccccccccccccccccccccc<3337BBBM@@nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn@@uBM7111<<ccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lccccccccccccccccccccccccccccccccccccccccccccc1337MBB@nnn+mrfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe+9M71<<<ccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc<3337BB@nnnr%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%s771<<<ccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc<333MBMnn+&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+73<ccccccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BB@n+&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%73<xcxcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BB@ne%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cllxcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBn+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBne%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kklcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<kkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1cl:;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1clk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1clk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1clk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk;lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:lcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkcccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<lk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<lkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<333MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1333BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xkkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xk:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1cxlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBnf%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xl:xcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$www$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$0u9 9uZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$juA NZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0wwwwj$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$j@C A@j$$$$$$$$$$$$$$$$$$$$$$$$jN 5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@9 A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@uC d$$$$$$$$$$$$$$$$$$$$$$$$0uN 9gj$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$gA A@$$$$$$$$$$$$$$$$$$$$$$$g d$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j @$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jNA$$$$$$$$$$$$$$$$$$$$$$dC 9w$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$j9 N0$$$$$$$$$$$$$$$$$$$$$9C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$d w$$$$$$$$$$$$$$$$$$$ZC A99N 90$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$0A C9999 AZ$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jA Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$ju 5dj$$$$@ g$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$0A uj$$$jZuC d$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@ 9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$jN 9j$$$ZZ$$$ZA u$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$0A AZ$$$$$$0uA w$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jCj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$jC A d$$$Z Z$$$Z u$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$jC u$$$$$$$j@A Aj$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$jN Cwju d$$ZZjuC wg u$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$u Z$$$$$$$$ju 9$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$5 uj$$$u w$ju NZj$9 g$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$w Ng$$$$$$$$$$wC d$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$g Aw$$$$$$u A0u ujZ$$$w Aj$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$9 5dj$$$$$$$$$$$$$j5 C$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$jA 9j$$$$$$$$N Nj0$Z Z$$$9 9$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$w Auj$$$$$$$$$$$$$$$$$$5 d$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$@ u$$$g d$w@jjA 5$$ZZZ$$ju w$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$u uj$$$$$$$$$$$$$$$$$$$$@ 9$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$jA u$$$$jN 5 0$w Z$$$$$dA 5$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$A Aw$$$$$$$$$$$$$$$$$$$$$$u j$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$d d$$$$$d 9j$$$u Aj$$wN j$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$w 9j$$$$$$$$$$$$$$$$$$$$$$$9 d$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$5 d$$j5 CAN$$$$jA uZ9 g$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$@ u$$$$$$$$$$$$$$$$$$$$$$$$$ u$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$ 0$@ ujg g$$$$d Adu 5$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$u u$$$$$$$$$$$$$$$$$$$$$$$$$w 9$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$0 A0j0$$$NN$$$$Z 9j$jA C$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$9 9$$$$$$$$$$$$$$$$$$$$$$$$$$u 9$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$Z Nj$$$$j0$$j5 CZ$$$$u $$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$9 Nj$$$$$$$$$$$$$$$$$Zj$$$$$$$C $$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$@ u$$$$$$j@A @j$$$dZZ 0$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$9 0$$$$$$$$$$$$$$$j@A 9$$$$$$0 $$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$@ Z$$$j@A j$$j9 5j w$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$9 @$$$$$$$$$$$$$$$gA j$$$$$u N$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$@ Ajwu Au g$ZA @j$ w$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$5 N$$$$$$$$$$$$$$ju Z$$$$jA 9$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$@ A C@j$@ N0 C0$$$ 0$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$@ @$$$$$$$$$$$$$jN @$$$$@ u$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$Z 9d$$jZj 0@j$@A0 $$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$Z u$$$$$$$$$$$$$9 @$$$jA g$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$w 9w$$$$u $u d$jN 9j A$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$j C$$$$$$$$$$$$@ @$$$u 0$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$ Cw$Zw$$$N9$d ujA g$$ 5$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$9 0$$$$$$$$$$0 @$$w C$$$$0j$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$9 Aj$C 5jj u$j CZA0$$Z g$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$@u5999u$$$d u$$$$$$$$$$9 @$jC @$$$@A@du0$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$g g$ju A9 0$$C j$$$jC j$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$du @uN j$$$A 0$$$$$$$$w @$N j$$wAjwC5N$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$j C$$$0N j$$u Z$$jN 9$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$N@5Cw$$$$g N$$$$$$$$5 Zu @$$$@uj900A$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$u 0$$$d A0$@ u$0N Z$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$@ Nj$$$$$$N @$$$$$$j A Aj$$$wC95$u5$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$jA u$$jACwAA0w NgA 9$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$w u$$$wg$$$0 d$$$$$g Z$$$j$dg09C0$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$@uuj$$$@ C$$u w$0Agj 0$$$@@j$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$jg$$ju A0$$$d w$$$$5 @$$$jA5j$jdj$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$jCCggNj$$$N jw 5$$$$j@ @$$$@55N$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$wCN0wN$$$$u d$$$ u$$$$$0NCw$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$5u$$$ud$$$jA dgAj$$0u 9$$$jCj$NC@j$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$g uCj$90$$$$@ u$0 u$$$$dgjju @$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$Nj$$$uu$$$$0A u$$0gN Nj$$$9g$Z5ZN5$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$dw$@5uAjw$$$$dA Cu g$$$$0 A5CC Z$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$uZ$$$u0$$$$$0A C5A 9j$$$$u uNj$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$d50d u$$$$j9 N0$$$$$$wANj$0w$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$jCN@$$$$$$$$$j9 u$$$$0@Z0NAZ$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$d u9uj$$$$w9 Cd$$$$j@C9Zj9Ad$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$00$$$$Zu$$$$$gA Cw$$$$dA9NNjgAu$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$0 9$$ j$$$$$$0uC Cuw$$$$$$Nuwu w$g j$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$jgC9N$$$$$$j@A Cd$$$$$j 0$$uu$jw$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$0A5A@uAj5Z$$$$$$$jwg@@@@wj$$$$$$$$wC$$$uC$$j$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$09A9jN0$@Z$$$$$jd5A CuZ$$$$$$ww $$$j j$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$dN$j59ZwAj$$$$$$$$$$$$$$$$$$$$$jNjdA$$$0 j$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$0@wAu5$w 0$$$$$$$$$jwZ@@wwj$$$$$$$09ujC0$$jAj$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$9@$$$$dj$$$$$$$$$$$$$0uC59@jA@$$0C$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$0 ZjC@$$$$$$$$$$$$$$$$$$$$$$$juAC$$dCwwNu$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$dAj$$$0 0$wu@$$$$$$$jN d$wAjd 5@Cd$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$ZN$uCj$$$juuw$$$$$$$$$$$$$$w$jdjCg$$wCAu$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$jCd$$$$uN$gAuuCj$0 g$$Z$Ad$$9@$wuu0$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$0Z0 w$$$0AuuAZjg$$$$$$$$$$u @$$$ZAj$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<xlkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$w d$$$$AgjAd$$Cd$@CN$$$$u9$$0 j$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$dAw$$$uu$$d9d $$@9u5$$$$u9Aw$$$95$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$ju9w$Z jw $$$$j$9@CZ$$$Z j$$uu$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$0Nuj$N0$$jd@9$$u5@9$$$$55gA0$$jAw$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$ww$u5$0 j$$$$$A0gC$$$$Ag$$j$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$@0$Cw$$$$u9$$9@dC$$$$u5u N$$$0$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$uZ$jAd$dNjZ 0$$$@d$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$ZA@u9$9@$$N@w $$$$uAuZ u$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$ZAACd$@9$$u9$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$Zu@j$u5$j ww $$wjuu$$j$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$j$$$dw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$wCAC5$$ 9ZZw$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$jj$$$j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$jw@@@@@@Z0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$jgN Cu0$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$jg5C 9uZ$$$$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$ju 9w$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$dN A@j$$$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$gA 5j$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$wC A@j$$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<133MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$j9 Aw$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$ju C0$$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$jN 9999N d$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$jN d$$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$jN 9@Z0$$$$$$$$u d$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$0A C5@5C d$$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$jN AuZ$$$$$$$$$$$$$$u w$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$jN 9w$$$$$gA d$$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$u 9d$$$$$$$$$$$$$$$$$$9Aj$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$9 g$$jdu9u$w A0$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$w 9Z@u$$$$$$$$$$$$$$$$$$jA5$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$@ d$ju 0$5 N$$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$C 9wdA @$$$$$$$$$$$$$$0wwg5 w$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$jA u$0A N@Z0$$@ @$$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$d AgwN w$$$$$$$w@u9A 9$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$u CjjC Nw$$$$$$Z Aj$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$9 90u 9$$$0@N 0$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$j @$u Cj$$$$$$$@ @$$$$$$$$$$$$$%g1<xlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$j @wA NdjuC u$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$g 0j w$$$$$$$$N C C$$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$g dZ Nww5 A5N C$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$N $w N$$$$$$$$0 99 0$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$5 A0jN Cdw9 Au0$00N j$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$00$$$w w$$$$$$$$$$j $juw$$$$$$$$9 wN @$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$C CjjN @0u 9d$$$N @jA w$$$$$$$$$$$$$$$$99$$$$$$$$$$$dudj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0u9 9$$$w w$$$$$$$$$$Z Z$$$$$$$$$$u uj 5$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$ NjjujgA 9w$$$$$@gj$w @$$$$$$$$$$$$$$$$99$$$$$$$$$$$$C j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$w 9ud0$$$w w$$$$$$$$$$@ 9$$$$$$$$ju Cj@ C$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$ 5$j9 9w$dCA$$$$$$$$u @$$$$$$$$$$$$$$$$99$$$$$$$$$$$Z 5$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$wj$$$$9$$$$$$$w w$$$$$$$$$$@ d$$$$$$wN A0jA $$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$w 5A Cd$w9 CZ$$$$$dANjA @$$$$$$$$$$$$$$$$99$$$ZCAuj$$$u d$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0Au$$$$9wu9uj$$w w$$$$$$$$$$9 C 9dww@N A0$5 $$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$j 0$9 A@j$$$$$$g5Z$g @$$$$$$$$$$$$$$$$99$$ju$u d$$jAAjj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$gC j$$$uAA 5$$w w$$$$$$$$$$9 udA 9j$d $$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$ 9$9uj$$$099$$$$$$$C @$$$$$$$$$$$$$$$$99$$$$$g @$$d AC Cj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@d 5$$$ZZ$0 j$w w$$$$$$$$$$u @$jg9 A5w$$g $$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$ g$$$$ju Ag$$$$$$$g d$$$$$$$$$$$$$$$$99$$059u @$$9 w$@ 9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@j9 w$$$$$$u j$w w$$$$$$$$$$@ Aw$$$$$$jw$$$$j5 A$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$9 Aj$j@ uj$$$$$0CAjA w$$$$$$$$$$$$$$$$99$$CN$w @$j C$$j C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$g00 9ujj$$$@9$$w w$$$$$$$$$$d Nj$$jN@0$$$$$0uA 9$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$u u$5 90$$$$$$$ZC@$u $$$$$$$$$$$$$$$$$99$$ AZ5 @$@ u$$d u$$j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@Cuj$$$uwjC 9jduj0C0$$w w$$$$$$$$$$0 Nj$$$N A999A u$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$Z www$$$$d5$$$$$$d9 5$$$$$$$$$$$$$$$$$99$$@ 9wC9jC @$jNAj$dC 5uj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u u$$$guA9 Cjj5Cuj$$$w w$$$$$$$$$$$A Nj$$$u Z$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$A 9$$$$ZC N$$$j@A d$$$$$$$$$$$$$$$$$99$$$$$$$$$j@ 995w$Z A0$5N$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Agju5d@jZ9w$u uj$$$$$$$w w$$$$$$$$$$$u Aj$$$d j$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$u w$w9 Ad$$juA Aj$$$$$$$$$$$$$$$$$99$$$$$$$$$$$jj$$$$C Z$$u@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$uw$wA Aj$$Zuw$$$$$$$$$w w$$$$$$$$$$$w w$$$0A u$$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$j 9$ A@j$j@ @$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$ Cj$$w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jZ$u@w@ d$$j$$$$$$$$$$$w w$$$$$$$$$$$$C u$$$0A w$$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$@ w0j$$@A Aj$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$9C$$$$$j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0$$$9j$$$$$$$$$$$$$$w w$$$$$$$$$$$$Z Cj$$0A 9$$$$$$$$$$$$$$%g1cxlkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$jC 9$$ZC Z$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$0Agj$j9 uj$$@j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ju9@$$$$$$$uj$$$$$$$$$$$$$$w w$$$$$$$$$$$$$9 d$$dA j$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$0 w9 u$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$juZjA 9w0Cjj5AZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$C @$$jud5d$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$jA uju g$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$d N$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$u @$$$59A N0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$d ZjuAj$$@Nd$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$Z u$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$d Nj$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$5 $$$jN @$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@9$$$ud$w d$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$d Nj$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$d 5j$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$ZA0$wA N0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$dNj$$j5$9 j$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$d 9j$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$0C @$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$Zu9 uj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$wZ$$$@d u$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$ZA u$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$j@A 90$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$@ Cw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$gCAj$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$j5 CZ$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$j@C 5w$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$jNj$Zu@j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0 @$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$w9 A@j$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$w@9A 9udj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$0jN Cj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9j$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$0uC A5d$$$$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$u 5Cjw9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jZ0$$$$$$jw$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$jw@@@@@Z0$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$$uC0$$$$$$$$$$$$$$$$$$$uw$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$CN$u0$Nj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j 9ugw$ww$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$jAAw$0j$$$$$$$$$$$$00$$uu$$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$Nd$Z5u $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$CuN j$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$$u0$$$$$$$$$$$$$j0$$$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$g9AjjC @C9u@00w$$90@u$$j j$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$@u$j u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0 9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Nj$$wdu9A$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$w CCu00$$$$$$j@N 5$$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBns$$$$$$$$$$$$$$$$$Cg $5NCZ wg@0u d$Ndj j$$9d$$$$$$$$$$$$$$$$$$$$$$$99$$$$$$$$$$$$$$$$$$$$$$$$$$5w$wZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9 w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$uj$$$$$$u$$$$$$$$$$$$$$$$$$$$$w w$$$$$$$$$$$$$$$$$$$$uN$0@d j9g$0Nj @$wAg$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBnf$$$$$$$$$$$$$$$$ZCwNu99@@C0$$$@CAj9@$5g$$g9$$$$$$$$$$$$$$$$$$$$$$$9N$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$d C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j$$$$$$d$$$$$$$$$$$$$$$$$$$$$Z w$$$$$$$$$$$$$$$$$$$$CCgj$Z $ Ajw $9u$$u9$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBnf$$$$$$$$$$$$$$$$ggdCA0 juAC 9$dC@u5u$dNj09u$$$$$$$$$$$$$$$$$$$$$$$@ 0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jC d$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$5 j$$$$$$$$$$$$$$$$$$$0 guA0@9$A9uw $gA$$dN$$$$$$$$$$$$$$$$$$$$$%g1cxxkxccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BBnf$$$$$$$$$$$$$$$$$$dCwuu$9@$$j$w $9A9$$5 Ag$$$$$$$$$$$$$$$$$$$$$$$$jAAgwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwu CwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwZ5 u$$$$$$$$$$$$$$$$$$$$gC$$$$u5$9u9g $j 0$55$$$$$$$$$$$$$$$$$$$$$%n1xllkcccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc1133BB@f$$$$$$$$$$$$$$$$$$$$$90$C9Zw$$0 $0 9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0C u$$$$$$$$$$$$$$$$$$$$$d@$$$$9@$9@jA w$CCCNj$$$$$$$$$$$$$$$$$$$$$%@1k:k:cccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc<113MBuf$$$$$$$$$$$$$$$$$$$$$$$$g@9NC$$C0$w@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwj$$$$$$$$$$$$$$$$$$$$$$$$$$$$Ad$9@$u w$g@0$$$$$$$$$$$$$$$$$$$$$$$&1<==;:cccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccc<1137MNr$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jj$dw$jwj$$$$$$$$$$$$$$$$$$$$$$$$$$$-<xaa*:cccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccc11137Mu$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$r<<atyakcccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccc<111377ue$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&-<<kXOtaccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccc11113733@gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnZ1<<kXXXOkccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccc<1111113311111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111<<<c*OXVXacccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccc<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ccccccccccccccccccccclk*tXXXaccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccc<<<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkk;*pOXXpcccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk::::::::::::::::::::::::::;=apty;ccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccccxxlkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;*a=:ccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<cc<cc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<cc<cc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cccc<cc<cccccc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<ccc<c<cccccc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<ccc<c<cccccc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<ccc<c<cccccc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<ccc<<<c<<c<<<<c<c<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccc<c<ccc<c<c<c<c<<<<c<cc<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<ccc<c<c<c<c<<<<c<cc<c<cccccccccccccccccccccccccccccccccccccccccccccccccc<c<ccc<c<c<c<c<<<<c<cc<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<c<cc<<c<c<<<<<<c<<c<cc<ccccccccccccccccccccccccccccccccccccccccccccccccccc<cccc<<c<c<<<<<<<c<<<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cccc<<c<c<<<<<<<c<<<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccc<cccc<<c<c<<<<<<<c<<<c<c<ccccccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<c<c<<<<<<<<<<<<<<<<<<<c<<c<ccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<c<<<<<<<<<<<<<<<<<c<c<c<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<c<<<<<<<<<<<<<<<<<c<c<c<cccccccccccccccccccccccccccccccccccccccccccc<cc<<<<c<<<<<<<<<<<<<<<<<c<c<c<ccccccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<c<<<<<<1<11111<11<<<<<<c<cc<c<ccccccccccccccccccccccccccccccccccccccccccc<ccc<<<<<<1<11111<1<<<<<<<c<cc<c<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<ccc<<<<<<1<11111<1<<<<<<<c<cc<c<cccccccccccccccccccccccccccccccccccccccccc<ccc<<<<<<1<11111<1<<<<<<<c<cc<c<cccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<cc<<<<<1<11111111111111<1<<<<<<c<c<cccccccccccccccccccccccccccccccccccccc<c<cc<<<<<<111111111111111<1<<<<<<c<c<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<cc<<<<<<111111111111111<1<<<<<<c<c<ccccccccccccccccccccccccccccccccccccc<c<cc<<<<<<111111111111111<1<<<<<<c<c<ccccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<<<1111113333333333111111<<<<<<cccc<cccccccccccccccccccccccccccccccccc<cc<<<<<<1111113333333333311111<<<<<<cccc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<<<1111113333333333311111<<<<<<cccc<ccccccccccccccccccccccccccccccccc<cc<<<<<<1111113333333333311111<<<<<<ccc<ccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<<111113337377777733333331111<<<<<<<ccccccccccccccccccccccccccccccccc<c<c<<<<<111113337377777733333331111<<<<<<<ccc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<<111113337377777733333331111<<<<<<<ccc<cccccccccccccccccccccccccccc<c<c<<<<<111113337377777733333331111<<<<<<ccc<ccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccccc<c<c<<<111333777777M7M7MM77773331111<<<<c<<ccccccccccccccccccccccccccccccccc<c<c<<<111333777777M7M7MM77773331111<<<<c<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<<111333777777M7M7MM77773331111<<<<c<<cccccccccccccccccccccccccccccccc<c<c<<<111333777777M7M7MM77773331111<<<<<<cccccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<111333777MMMBBBBBBBBBMM7M77333311<<<<<c<c<cccccccccccccccccccccccccc<c<c<<<<111333777MMMBBBBBBBBBMM7M77333311<<<<<c<c<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<111333777MMMBBBBBBBBBMM7M77333311<<<<<c<c<cccccccccccccccccccccccccc<cc<<<<111333777MMMBBBBBBBBBMM7M77333311<<<<<<c<c<cccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxcccccccccccccccccccccccccccccccccccccccccccccc<cc<<<<11133377MMBBBBBBBBBBBBBBBBMM777333111<<<<<ccccccccccccccccccccccccccccc<c<<<11133377MMBBBBBBBBBBBBBBBBMM777333111<<<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<c<<<<1133377MMBBBBBBBBBBBBBBBBMM777333111<<<<<cccccccccccccccccccccccccc<cc<<<<11133377MMBBBBBBBBBBBBBBBBMM777333111<<<c<ccccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccccc<<<<<111337MMMBBBBBBBBBCBBBBBBBBBBBM77333111<<<c<<c<cccccccccccccccccccccc<c<c<<<111337MMMBBBBBBBBBCBBBBBBBBBBBM77333111<<<c<c<cccccccccccccccccccccccccccccccc1137BBC C C CCBB7311cccccccccccccccccccccccccccccccccc<c<<<111337MMMBBBBBBBBBCBBBBBBBBBBBM77333111<<<c<c<cccccccccccccccccccccccc<<<<<111337MMMBBBBBBBBBCBBBBBBBBBBBM77333111<<<<c<ccccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccc<cc<<<111377MMBBBBBBBCBBBBBCBBCBBBBBBBBM7733111<<<c<ccccccccccccccccccccccccc<c<<<111377MMBBBBBBBCBBBBBCBBCBBBBBBBBM7733111<<<<ccc<ccccccccccccccccccccccccc137BCCBM73331111113337MBCCB731ccccccccccccccccccccccccccc<c<<<<113377MMBBBBBBBCBBBBBCBBCBBBBBBBBM7733111<<<<ccc<cccccccccccccccccccc<cc<<<111377MMBBBBBBBCBBBBBCBBCBBBBBBBBM77331111<<<cc<c<ccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccc<cc<<<<113377MBBBBBBBCBBBBCBBBBBBBBBCBBBBBM77331111<<c<c<cccccccccccccccccccc<cc<<<113377MBBBBBBBCBBBBCBBBBBBBBBCBBBBBM77331111<<<<cccccccccccccccccccccccc17BBM73<c<c<cc<cc<ccccc<c<<c<37MBB71cccccccccccccccccccccc<ccc<<<113377MBBBBBBBCBBBBCBBBBBBBBBCBBBBBM77331111<<<<cccccccccccccccccccc<cc<<<<113377MBBBBBBBCBBBBCBBBBBBBBBCBBBBBM7733111<<<<<cccccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccccc<c<<11337MMBBBBBBCBBBB731<<<<<137MBBBBBBBMM773111<<<<ccccccccccccccccccccc<cc<<<11337MMBBBBBBCBBBB731<<<<<137MBBBBBBBMM773111<<<c<cccccccccccccccccccc17CM31cccccccccccccccccccccccccccc<c13MC71ccccccccccccccccccccc<<<<11337MMBBBBBBCBBBB731<<<<<137MBBBBBBBMM773111<<<c<ccccccccccccccccccccc<c<<11337MMBBBBBBCBBBB731<<<<<137MBBBBBBBMM773111<<<cc<cccccccccccccccccccccccccccccccccccc<333MB", +"1<clkxccccccccccccccccccccccccccccccccccccccccccc<c<<<11337MMBBBBCBBBB7<cccc<<<<<<1<<13BBCBBCMM733311<<c<ccccccccccccccccccccc<<<<11337MMBBBBCBBBB7<cccc<<<<<<1<<13BBCBBCMM733311<<<cc<cccccccccccccccc1CM3cxcxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxccxc3MC1ccccccccccccccccc<c<<<11337MMBBBBCBBBB7<cccc<<<<<<1<<13BBCBBCMM733311<<<cc<ccccccccccccccccc<c<<<11337MMBBBBCBBBB7<cccc<<<<<<1<<13BBCBBCMM733311<<<<ccccccccccccccccccccccccccccccccccccc<333MB", +"1MMMMMMMMMMMMMMMMMMMMMMMMMMM3<ccccccccccccccccccc<c<<11137MBBBBBBBBB3cxcxxxxxccc<<<1<1113MBBBBBM733111<<<c<ccccccccccccccccc<cc<<<1137MBBBBBBBBB3cxcxxxxxccc<<<1<1113MBBBBBM733111<<<cccccccccccccccccCB3cxxllllllllllklklkkklklklllllllllllxlxxxxc3BCcccccccccccccccc<c<<<1137MBBBBBBBBB3cxcxxxxxccc<<<1<1113MBBBBBM733111<<<ccccccccccccccccccc<c<<11137MBBBBBBBBB3cxcxxxxxccc<<<1<1113MBBBBBM733111<<c<cccccccccccccccccccccccccccccccccccc<333MB", +"1BBMBBBBBBBBBBBBBBBBBBBBBBBBM3<cccccccccccccccc<cc<<<1337MBBBBBBCB7<xllkkklllxcccc<<<<11117BBBBBM733111<<<ccccccccccccccccccc<<<<1337MBBBBBBCB7<xllkkklllxcccc<<<<11117BBBBBM73311<<<<cccccccccccccccC7cxlllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkllllxc7Cccccccccccccc<cc<<<1337MBBBBBBCB7<xllkkklllxcccc<<<<11117BBBBBM73311<<<<cccccccccccccccc<cc<<<1337MBBBBBBCB7<xllkkklllxcccc<<<<11117BBBBBM73311<<<<cccccccccccccccccccccccccccccccccccc<333MB", +"1BBMBBo>>>>>>>>>>>>>>>>>>>>oBM3cccccccccccccccccc<<<1137MMBBBBCBB1xlk:;;;;:kkllxcc<<<1<11113MCBBB733111<<cc<cccccccccccccc<c<c<<1137MMBBBBCBB1xlk:;;;;:kkllxcc<<<1<11113MCBBB733111<<c<ccccccccccccc1 cxlllkkkkkkk:k::k:k::k::k::k::::kk:kkkkkkkklllx1 Mcccccccccccccc<<<1137MMBBBBCBB1xlk:;;;;:kkllxcc<<<1<11113MCBBB733111<<<c<cccccccccccccccc<<<1137MMBBBBCBB1xlk:;;;;:kkllxcc<<<1<11113MCBBB733111<<c<ccccccccccccccccccccccccccccccccccc<333MB", +"1BBMBoh66666666666666666666,oB3ccccccccccccccc<c<<<<1337MBBBBBBBcxk;=*a**==;:klxxcc<<<1111113MBBBB773111<<<ccccccccccccccccc<<<<1337MBBBBBBBcxk;=*a**==;:klxxcc<<<1111113MBBBB773111<<cccccccccccccc1 cxllkkkkkkkkkkkkkkkkkkkkkkkkkkkkk:kkkkkkkkkkllx1 M<ccccccccc<c<<<<<1337MBBBBBBBcxk;=*a**==;:klxktVa<<1111113MBBBB773111<<ccccccccccccccc<c<<<<1337MBBBBBBBcxk;=*a**==;:klxxcc<<<1111113MBBBB773111<<cccccccccccccccccccccccccccccccccccc<333MB", +"1MMMB,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<c<<1137MBBBBCBBcl:=apypppa*=;=yqvzzX<<<<111113MBBBM7331<<<cccccccccccccccc<cc<<1137MBBBBCBBcl:=apyppXa*=;:klxxcc<<<<111113MBBBM7331<<<<c<ccccccccccc1 cxllllllkllkllklkklklkkklkkkkkkkkkkkkkkkkkllllx1 M<ccccccccccccc<<1137MBBBBCBBcl:=apypppa*=;aXvzzzzO<<<111113MBBBM7331<<<<cccccccccccccccc<<<1137MBBBBCBBcl:=apypppa*pVyklxxcc<<<<111113MBBBM7331<<<<c<ccccccccccccccccccccccccccccccccc<333MB", +"1MMMB,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<cc<<1137MMBBBBBBcl:*pyttttpp*y8zzzzzzzq<1<1111113MCBBM33111<<c<cccccccccccccc<<<1137MMBBBBBBcl:*pytttvz4*=;:klxxcc<<1<1111113MCBBM33111<<ccccccccccccc1 <xxxxxllxllxllxlxlllllxlllllllllllllllllllllllx< M<ccccccccc<c<<<1137MMBBBBBBcl:*pyttttpp*X4zzzzzzzz*1<1111113MCBBM33111<<cccccccccccccc<c<<1137MMBBBBBBcl:*pyttttyatz4v8lxxcc<<1<1111113MCBBM3311<<<ccccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<<<1137MBBBBCB<l:*ptOXXOtyOvzzzzzzzz4y<<<11111333MBBB7311<<<<cccccccccccc<c<c<<1137MBBBBCB<l:*ptOXXOvzzX*;:kllxcc<<<<11111333MBBB7311<<<<cccccccccccc1 cccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1 M<ccccccccccc<<<1137MBBBBCB<l:*ptOXXOtyVzzzzzzzzzzzz:<11111333MBBB7311<<<<ccccccccccc<cc<<<1137MBBBBCB<l:*ptOXXOtXpvO=:Ollxcc<<<<11111333MBBB73111<<<cccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<<<11377BBBCBB3xk=pOXXXXOXvzzzzzzzztk<<<<1111131337BBBM3311<<ccccccccccccccc<<<<1377BBBCBB3xk=pOXX4vXXzzv=;:kkxxcc<<<1111131337BBBM3311<<ccccccccccccc1 <cccccccccccccccccccccccccccccccxcxcxcxcxxxxccc1 M<cccccccc<c<<<<1377BBBCBB3xk=pOXXXXO4vzbvzzzzzzzzzzv:111131337BBBM3311<<cccccccccccccc<<<11377BBBCBB3xk=pOXXXX4zzvz=;t*lxxcc<<<1x*1131337BBBM3311<<ccccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<<1137MBBBBBBck=atOXXXVvzzzzzzzvpxxcc;VV<1111131337CBB7311<<<ccccccccccccc<c<<1137MBBBBBBck=atOX4zzVt4zzX;:kllxccc<<<1111131337CBB7311<<<cccccccccccc1 <<c<c<c<c<c<c<c<cc<cc<cc<cccccccccccccccccccccc1 M<ccccccccccc<<1137MBBBBBBck=atOXXXqvzzb*azzzzzvyaXzz41111131337CBB7311<<<cccccccccccc<c<<1137MBBBBBBck=atOXXXqzqX84a4zal:xccc<<:zz4c131337CBB7311<<<cccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccc<c<<<133MMBBCBB<x:*pOXXV4zzzzzzz4aklxxXvzzzy1111113333BBBM3311<<ccccccccccc<cc<<1133MMBBCBB<x:*pOXXvzzzOtvzz*kklxxcc<<<<1111113333BBBM3311<<cccccccccccc1 1c<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<c1 M<ccccccccc<<<1133MMBBCBB<x:*pOXXqvzzzzX=qzzz4axcc*zzzy111113333BBBM3311<<cccccccccc<cc<<<133MMBBCBB<x:*pOXqv48vypa=az4kl4=cc<<14vVz4c13333BBBM3311<<cccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<cc<<1137MBBBBBMcl;ayOXVvzzzzzzvX:kl:xcXzzzzvx1111313377BBB7111<cccccccccccccc<<<<137MBBBBBMcl;ayOXXbzzz4aXzzakllxxcc<<<111111313377BBB7111<ccccccccccccc1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3 M<ccccccc<cc<<<137MBBBBBMcl;ayOX8vzzzzzt=4z4tlxc;y4zzzzx111313377BBB7111<ccccccccccccc<<<1137MBBBBBMcl;ayO8zbbz8pV8=:zzXqz4kc<<yz=14zp313377BBB3111<ccccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccc<<<<1137MBBCBB1xk=ayOqzzzzzzzV;:k*qz=xcvzzzzp1113133337BBB7311<<cccccccccccc<c<<1137MBBCBB1xk=ayOXX4zzzzt=z4:klxxcc<<<<<11113133337BBB7311<<cccccccccccc1 1<<1<1111111111111<11<11<11<1<1<1<1<1<1<1<1<<<<3 M<cccccccc<<<<1137MBBCBB1xk=ayObzzzzzzv=;zzylx=vzzzzzzzV113133337BBB7311<<ccccccccccc<c<<1137MBBCBB1xk=ayXz8OtOp4zO;=zzzzzzX<<<z4111zV313337BBB7311<<cccccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccccc<<1337BBBBBBcx:=ayXzzzzzz4a;:=4zzzzkclzzpx11111313337MBCM311<<ccxccccccccc<c<<1337BBBBBBcx:=aytOOVzzzz4;;:klllxccc<<1<11111313337MBCM311<<ccxccccccccc1 1<1<1111111111<1<1111111111111<1<1<1<1<1<1<11<<3 M<cccccc<ccc<<1337BBBBBBcx:=aOvzzzzzzz8;tzzqO4zzzzzzzzzzk11313337MBCM311<<ccxcccccccc<c<<1337BBBBBBcx:=ayVzqtVXpXzV:4zzzzzzza<Xz=11Oz=333337MBCM311<<ccxccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccc<c<<<<133MBBCBB7cx:=apyOzzzvX=;;=zzzzzzVc<:<<1:p1111333337BBB3111<cxcccccccc<cc<<1133MBBCBB7cx:=ayytyVzzzzzt::kklxcc<c<<<<111111333337BBB3111<cxcccccccccc1 1<<1111111111111111111111111<1111111111111111<<3 M<cccccccc<<<1133MBBCBB7cx:=ap4zzzzX*yp:tzzzzzzzzzzzzzzzv111333337BBB3111<cxccccccc<cc<<<133MBBCBB7cx:=ayyz4vvy*Xzzbzzz4aaqzv:z4<11b411133337BBB3111<cxcccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<1137MBBBBB1cl:=*ppyXz4p=;;;:4zzzzzv;<<<:Ozzk133333377BBB711<<ccxxcccccccc<<<<137MBBBBB1cl:=*apyppzzzzzt::kllxxcc<<<11111133333377BBB711<<ccxxcccccccc1 1<<1<1111111111111111111111<111<1<1<1<1<1<1<<<<3 M<cccccc<cc<<<137MBBBBB1cl:=*py4zzzX=;;:8zzzzzzzzzzbypzzzk33333377BBB711<<ccxxccccccc<<<1137MBBBBB1cl:=*apqzzv*=bzzzz4Olxcyzzvz*11Ozk33333377BBB711<<ccxxcccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<<<<1137MBBBCB<clk;=aaaaX==;Vv=:=vzzzXl<<<<zzzzV311333377MCB711<<cxxcccccccc<c<<1137MBBBCB<clk;=aaaa*4zzzzy:kkllxcc<<<<<1111311333377MCB711<<cxxccccccccc1 1<<1<1<<<<<<<<<<<<<<<<<<<<<1<<<1<1<1<1<1<1<1<<<7 M<ccccccc<<<<1137MBBBCB<clk;=aaavzzz4X=:4zzzzzzzzzOx11zzzO31333377MCB711<<cxxccccccc<c<<1137MBBBCB<clk;=aaabzz88zzzzO;lxxavzzzb11xzV313333377MCB711<<cxxccccccccccccccccccccccccccccccc<333MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<1137MBBBBM<cxk:==***==*vz4OkkOz4kc<lX1<Ozzzzx33133337MBBM11<<cxxxccccccc<c<<1137MBBBBM<cxk:==***=Xzzzz8kkklxcc<<<<1<1111131333337MBBM11<<cxxxcccccccc1 77777777777777777777777777777777777373737373777M M<ccccccccc<<1137MBBBBM<cxk:==***vzzzzzzzzplazzzV<1<xVzzzzc1333337MBBM11<<cxxxcccccc<c<<1137MBBBBM<cxk:==**=vzzzzz4=kkl=vzzzzz*11yzk131333337MBBM11<<cxxxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<<<<1337MBBCB7<cxkk;;===;:vyk:kkllxxc<qzz*1xzzzO313333377MBBM11<<cxxxcccccccc<<<1337MBBCB7<cxkk;;===;*zzzzvkllxxcc<<<1<11111131333377MBBM11<<cxxxcccccccccM M<cccccccc<<<1337MBBCB7<cxkk;;===pzzzzzzq;lxxzzl<<<OzzzzzzO1333377MBBM11<<cxxxccccccc<<<1337MBBCB7<cxkk;;===*vzzzykkl=4zzyl<zz11xzV1111333377MBBM11<<cxxxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccc<c<c<<1337MBBBBM<cxlk:::;:::kkk;pyp:ccc*bzzv11Obp1313333737MBCM11<<cxlxxcccc<c<c<<1337MBBBBM<cxlk:::;:::8zzzzplxccc<<<1<111111313333737MBCM11<<cxlxxccccccccccMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM3<ccccc<c<<<<1337MBBBBM<cxlk:::;::Ozzzv*llkkcyzlxpzzzzzzzz83333737MBCM11<<cxlxxccc<c<c<<1337MBBBBM<cxlk:::;;:yzzOkk;XzzXl<1yzO11Ozc1333333737MBCM11<<cxlxxccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<<<<1137MBCBBM<<cxlkk:::kkk*qvzzzz4y<<*vzzp1xc13=k33333777BBM31<<cllxccccccc<<<<1137MBCBBM<<cxlkk:::kk*zzzzvkxc<<<<1111111131333333777BBM31<<cllxccccccccccccc<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ccccccc<c<<1137MBCBBM<<cxlkk:::kkvzzqlxtvy<lz4bzzzzzzzzzz33333777BBM31<<cllxcccccc<<<<1137MBCBBM<<cxlkk::kkkqztl=4z4;<<<*vzx1:v8113133333777BBM31<<cllxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccc<<<1337MBBBBM<<cxxlklkkllXzzzzzzzzz4x1:zz41111Vz=3337377MBBM1<<<xlllxccc<ccc<<<1337MBBBBM<<cxxlkklkkllvzzzzqccc1<*x11111111313337377MBBM1<<<xlllxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<1337MBBBBM<<cxxlklkkll*zz4xx4zq<14zzzzzzzzzzzz=337377MBBM1<<<xlllxcccccc<<<1337MBBBBM<<cxxlkkkkkllvzzzzyc<cxvzz411Vzk31333337377MBBM1<<<xlllxccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccc<c<<<1337MBBCB7<<ccxxlllllqzzzzzzllvzzvx1pO111cbzzV3333777MBCM11<<xllxxccccc<c<<<1337MBBCB7<<ccxxllllllx=zzzzz4l<<4zz:1111113133333777MBCM11<<xllxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<1337MBBCB7<<ccxxllllllxqzzacXX<<<VzzzzzzzzV4zzV333777MBCM11<<xllxxcccc<c<<<1337MBBCB7<<ccxxllllllxazzv;cc<Ozzzz=1xzz113113333777MBCM11<<xllxxccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccc<ccc<<1137MBBBBM<<<ccxxxxxXzzzzzzq<<4zzzO111111kzzzV3333777MBBM1<<cxlklccccc<ccc<<1137MBBBBM<<<ccxxxxxxxxcXzzzzzzy1=zzzx111131333333777MBBM1<<cxlklcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<1137MBBBBM<<<ccxxxxxxxxkzzq<<<<x4zzzzzzzvk33zzX333777MBBM1<<cxlklcccc<ccc<<1137MBBBBM<<<ccxxxxxxxxc4zyc<:vzzpzz11Vzz131333333777MBBM1<<cxlklcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<<<<1137MBBBCM<<<<ccccxxvzzzzzzO<:zzzzzp11kp11zzzt337777MMBB71<<clkkxxcccccc<<<<1137MBBBCM<<<<ccccxxcxccc4zzzzzz*1Vzzbc1131333333777MMBB71<<clkkxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<1137MBBBCM<<<<ccccxxcxccXzz<<lOvzzzzzzzp331Ozzv37777MMBB71<<clkkxxccccc<<<<1137MBBBCM<<<<ccccxxcxcckv4*XzzOxpzO1xzzzO3133333777MMBB71<<clkkxxccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<11337BBBBB1<<<<ccccXzzzzzzzx<*zzzzzV11zV31zzVc3333777BBC71<<cl:klccccccccc<<11337BBBBB1<<<<ccccccccc<lvzzzzzzxx4zzV31131333373777BBC71<<cl:klccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<11337BBBBB1<<<<ccccccccc<vzX*bzbOxpzz4c11kbzzzX333777BBC71<<cl:klcccccccc<<11337BBBBB1<<<<ccccccccc<Ozzzv=114z=1Vzzz433333373777BBC71<<cl:klcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccc<c<<<<1377MBCBB31<<<<<c<Vzzv*yV4<1Vzzzzzz11zz13V833337777MBBB1<<<xk:llcccccc<c<<<<1377MBCBB31<<<<<<c<cc<c<<:zzzzzzzcczzzx331333333777MBBB1<<<xk:llccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<1377MBCBB31<<<<<<c<cc<<<OzzzzVx11xzzc1cVzzzzv337777MBBB1<<<xk:llccccc<c<<<<1377MBCBB31<<<<<<c<cc<<<lbz4111xzb1kzzzzz3133333777MBBB1<<<xk:llcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccc<c<11137MBBBB71<1<<<<<zzzV<<<<<14zzzzzz13Vz=3c33337377MMBBB1<<cx::kxcccccccc<c<11137MBBBB71<1<<<<<<<<<<<<<:zzzzzzV1kzz131333333777MMBBB1<<cx::kxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<11137MBBBB71<1<<<<<<<<<<<:zzz:11113VzV=vzzzzb<37377MMBBB1<<cx::kxccccccc<c<11137MBBBB71<1<<<<<<<<<<<<Oz*11*zzV34zzzzz=33333777MMBBB1<<cx::kxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<<11377BBBBM11<1<<<<zzzvyx<11<zzzzzzz11Vz=33333737777BBBM1<<ck::lxccccccccc<<<11377BBBBM11<1<<<<<<<<<<<11:vzzzzzO1=c3133333377777BBBM1<<ck::lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<11377BBBBM11<1<<<<<<<<<<<4zV11*v=1pzzzzzzzXc3377777BBBM1<<ck::lxcccccccc<<<11377BBBBM11<1<<<<<<<<<<<xz4=4zzz=Vzzzzzzc333777777BBBM1<<ck::lxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccc<c<<<<1337MBBCB11111<1<vzzzzzz4V4zzzzzzz33V;3333337777MMBBB3<<cx:;:lxccccccc<c<<<<1337MBBCB11111<1<<<<<1<1<11x4zzzzzc1133333373777MMBBB3<<cx:;:lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<1337MBBCB11111<1<<<<<1<1pzz11Vzk1kzzzzzzp3373777MMBBB3<<cx:;:lxcccccc<c<<<<1337MBBCB11111<1<<<<<1<1<Vzzzzzzzzzzzz8c33333777MMBBB3<<cx:;:lxcccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<<11377BBBBM1111111Vzzzzzzzzzzzzzzzv13c33333373777MMBBB1<<cl;;klcccccccccccc<<11377BBBBM11111111111<111111cVzzzz13=pc333333777MMBBB1<<cl;;klccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11377BBBBM11111111111<11:zz:1p=11czzzzbk33333777MMBBB1<<cl;;klccccccccccc<<11377BBBBM11111111111<111kzzzzzzzzzzzOc333373777MMBBB1<<cl;;klccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccc<<<<11377MBBBB3111111kzzzzzzzzzzzzzzzt31333333737777MBBC7<<<xk;;klcccccccccc<<<<11377MBBBB31111111111111111111=VbzzzzzV333377777MBBC7<<<xk;;klccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<11377MBBBB311111111111111zzp1113=vzzzO3333377777MBBC7<<<xk;;klccccccccc<<<<11377MBBBB3111111111111111vzzzzzzzzbk33333737777MBBC7<<<xk;;klccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<<<11377BBCBM11111114zzzzzzzzzzzzzzc333333337777MMMBBB1<<cl;=:lxcccccccccccc<<<11377BBCBM111111111111111111313cVzzzz;3377777MMMBBB1<<cl;=:lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<11377BBCBM11111111111111zzV31cvzzzVc333377777MMMBBB1<<cl;=:lxccccccccccc<<<11377BBCBM111111111111111XzzzzzzzO33333373777MMMBBB1<<cl;=:lxccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccc<c<c<<11337MBBBB7111111kzzzzzzzzzzzzzp3333333737777MMBCB7<<cx:==:lcccccccccc<c<c<<11337MBBBB71111111111111113131333=Ozz=3337777MMBCB7<<cx:==:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<<<11337MBBBB71111111111111zzzOOzzzbk33333337777MMBCB7<<cx:==:lccccccccc<c<c<<11337MBBBB711111111111111=zzzzz8k333333377777MMBCB7<<cx:==:lcccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<<<<11337MBBBB3131111=zzzzzzzzzzzp3333333737777MMBBBB<<<cl=*;kxccccccccccccc<<<<11337MBBBB31311111113131313131333;zzzz47777MMBBBB<<<cl=*;kxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<11337MBBBB3131111111313zzzzzz8k333333777777MMBBBB<<<cl=*;kxcccccccccccc<<<<11337MBBBB313111111131313zzz8=3333333773777MMBBBB<<<cl=*;kxcccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccccc<cc<<11337MMBCBM3313333k4zzzzzzzbp3333333737777MMBBBB3<<<l;*=:lxcccccccccccc<cc<<11337MMBCBM3313313131311313333333czz4XX777MMBBBB3<<<l;*=:lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<11337MMBCBM331331313131zzzz8=3333333773777MMBBBB3<<<l;*=:lxccccccccccc<cc<<11337MMBCBM33133131313113z8p33333333737777MMBBBB3<<<l;*=:lxcccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3ccccccccccccccccc<<<<11337MMBBBM33111133kV8zzV=33333337377777MMMBBC7<<cx:**=kxccccccccccccccc<<<<11337MMBBBM33113131313333333333373777377MMMBBC7<<cx:**=kxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<11337MMBBBM3311313131czbOc33333373737777MMMBBC7<<cx:**=kxcccccccccccccc<<<<11337MMBBBM33113131313333333333337737777MMMBBC7<<cx:**=kxccccccccccccccccccccccccccccccccc<313MB", +"1337B,hiiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccc<c<<<<11337MBBBBM333331333333333333337377777MMBBBBM<<<cl=a*:lxcccccccccccccc<c<<<<11337MBBBBM33333333333333333333737777MMMBBBBM<<<cl=a*:lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<11337MBBBBM333333333ck3333333333777777MMBBBBM<<<cl=a*:lxccccccccccccc<c<<<<11337MBBBBM33333333333333333333737777MMMBBBBM<<<cl=a*:lxccccccccccccccccccccccccccccccccc<313MB", +"1337B.6iiiiiiiiiiiiiiiiiiii,>B3cccccccccccccccccccc<<1113377MCBBB7333333333333333373777777MMBBCBM<<<cl=aa=kxccccccccccccccccccc<<1113377MCBBB333333333333333337377777M7MBBCBM<<<cl=aa=kxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<1113377MCBBB3333333333333333377777777MMBBCBM<<<cl=aa=kxcccccccccccccccccc<<1113377MCBBB333333333333333337377777M7MBBCBM<<<cl=aa=kxcccccccccccccccccccccccccccccccccc<313MB", +"1337Bo>....................>#B3cccccccccccccccc<cc<<<<113337MMBBBB7333333333373737777777MMMBBBBM<<<cl;ap=:lxccccccccccccccc<cc<<<<113337MMBBBBM3333333333337377777777MMBBBBM<<<cl;ap=:lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<113337MMBBBBM333333333373737777777MMMBBBBM<<<cl;ap=:lxcccccccccccccc<cc<<<<113337MMBBBBM3333333333737377777777MMBBBBM<<<cl;ap=:lxcccccccccccccccccccccccccccccccccc<313MB", +"1337BB#o####################BM3cccccccccccccccccc<c<<<<1113377MCBBBB777373737377777777MMMBBBBB7<<<cx:ap*;kxcccccccccccccccccc<c<<<<1113377MCBBBM777373737777777777MMMBBBBB7<<<cx:ap*;kxcccccccccccccc7 7ccccccccccccc<ccc<<<<1113377MCBBBM777373777377777777MMMBBBBB7<<<cx:ap*;kxccccccccccccccccc<c<<<<1113377MCBBBM773737373737777777MMMBBBBB7<<<cx:ap*;kxccccccccccccccccccccccccccccccccccc<313MB", +"1337MBBBBBBBBBBBBBBBBBBBBBBBM3<ccccccccccccccccccccc<<<<1113377MBBBBBMM777777777777M7MMBBBBCB3<<<cx:apa;kxcccccccccccccccccccccc<<<<1113377MBBBCBMM777777777777M7MMBBBCBB7<<<cx:apa;kxcccccccccccccc1 1<<<c<<c<c<c<<<c<<<c<<<c<<<c<<<c<<<c<<<c<<<<c<<1 3ccccccccccccccccc<<<<1113377MBBBCBMM777377777777M7MMBBBBCB3<<<cx:apa;kxccccccccccccccccccccc<<<<1113377MBBBCBMM777777777777M7MMBBBCBB7<<<cx:apa;kxcccccccccccccccccccccccccccccccccccc<313MB", +"11111111111111111111111111<<<clcccccccccccccccccc<ccc<<<<11113337MBBCBBBMM7777777MMMBBBBBBBM1<<<cx:apa=:lxccccccccccccccccccc<ccc<<<<11113337MBBBBBBMM7777777MMMBBBBBBBM1<<<cx:apa=:lxcccccccccccccc1 <xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxcxc7 M<cccccccccccccc<cc<<<<11113337MBBBBBBMM7777777MMMBBBBBBBM1<<<cx:apa=:lxcccccccccccccccccc<ccc<<<<11113337MBBBBBBMM77777M7MMMBBBBBBBM1<<<cx:apa=:lxcccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccc<c<<<<111133377MBBBBBBBBBBBBBBBBBBCBBB3<<<<cl;apa=:lxccccccccccccccccccccccc<c<<<<111133377MCBBBBBBBBBBBBBBBBBCBBB3<<<<cl;apa=:lxccccccccccccccc1 cxlllllllllllllllllllllllllllllllllllllllxlllxx1 M<cccccccccccc<ccc<c<<<<111133377MCBBBBBCBBBBBBBBBBBCBBB3<<<<cl;apa=:lxcccccccccccccccccccccc<c<<<<111133377MCBBBBBBBBBBBBBBBBBCBBB3<<<<cl;apa=:lxccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccccc<c<<<1111133337MBBCBBCBBBBBBBBBBB71<<<<cxl;apa=:lxcccccccccccccccccccccccccc<c<<<1111133337MBBBCBBBBBBBBBBBBB71<<<<cxl;apa=:lxcccccccccccccccc1 cllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkllll< M<cccccccccccccccccc<c<<<1111133337MBBBBBBBBBBBBBBBBB71<<<<cxl;apa=:lxccccccccccccccccccccccccc<c<<<1111133337MBBBCBBBBBBBBBBBBB71<<<<cxl;apa=:lxcccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccc<cc<c<<<<111113333377MBBBBBBBCBM7311<<<<cxk=ap*=klxccccccccccccccccccccccccc<cc<c<<<<111113133377MMCBBCBBCBM7311<<<<cxk=ap*=klxccccccccccccccccc1 cllkkkk:k:k:k:k:k:k:k:kk:kk:kkk:kkk:kkkkkkk:kll< M<cccccccccccccccc<cc<c<<<<111113133377MBBBCBBCBBM7311<<<<cxk=ap*=klxcccccccccccccccccccccccc<cc<c<<<<111113133377MMCBBBBBBBM7311<<<<cxk=ap*=klxccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxccccccccccccccccccccccccccccccccccccccccccccccc<cc<c<<<<<<111111113313333311111<<<<<cxl:=aa*;klxccccccccccccccccccccccccccc<cc<c<<<<<<111111113333333311111<<<<<cxl:=aa*;klxcccccccccccccccccc1 clllkkkkkkkkkkkkkkkkkkkkkkkkk:kkk:kk:k:k:kkkkkl< M<ccccccccccccccccc<cc<c<<<<<<111111113313333311111<<<<<cxl:=aa*;klxcccccccccccccccccccccccccc<cc<c<<<<<<111111113333333331111<<<<<cxl:=aa*;klxcccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<<<1<111111111111111<<<<<ccxk;*a*=:klcccccccccccccccccccccccccccccccccc<c<<<<<<1<111111111111111<<<<<ccxk;*a*=:klcccccccccccccccccccc1 cxllllllllkllkllklklklkkkkkkklkkkkkklkkkkkkklll< M<cccccccccccccccccccccc<c<<<<<<1<111111111111111<<<<<ccxk;*a*=:klccccccccccccccccccccccccccccccccc<c<<<<<<1<1111111111111<1<<<<<ccxk;*a*=:klcccccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccccccc<ccc<c<<<<<<1<11<11<1<<<<<<<<<cxxk:==*=;klxccccccccccccccccccccccccccccccccc<ccc<c<<<<<<1<1<1<1<<<<<<<<<<<cxxk:==*=;klxccccccccccccccccccccc1 cxxxxlllllxllxllxllllllxlxllllllllllllllllllllx< M<cccccccccccccccccccc<ccc<c<<<<<<1<1<1<1<<<<<<<<<<<cxxk:==*=;klxcccccccccccccccccccccccccccccccc<ccc<c<<<<<<1<1<1<1<1<<<<<<<<<cxxk:==*=;klxccccccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccccccccc<cccc<c<<<<<<<<<<<<<<<<<cccxll:;==;:kllxcccccccccccccccccccccccccccccccccccc<cccc<c<<<<<<<<<<<<<<<<<cccxll:;==;:kllxcccccccccccccccccccccc1 <ccxxxcxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxx1 M<cccccccccccccccccccccc<cccc<c<<<<<<<<<<<<<<<<<cccxll:;==;:kllxccccccccccccccccccccccccccccccccccc<cccc<c<<<<<<<<<<<<<<<<<<ccxll:;==;:kllxcccccccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxccccccccccccccccccccccccccccccccccccccccccccccccccccccc<ccccccc<c<<<<<<c<cccxxlk:;;;::kklxccccccccccccccccccccccccccccccccccccccccc<cccccccc<<<<<<<c<cccxxlk:;;;::kklxcccccccccccccccccccccccc1 <cccccccccccccccccccccccccccccccccccxcxcxcxcccc1 M<ccccccccccccccccccccccccc<cccccccc<<<<<<<c<cccxxlk:;;;::kklxcccccccccccccccccccccccccccccccccccccccc<cccccccc<<<<<<<c<cccxxlk:;;;::kklxcccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"1<cxkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxcxxlllk:::::kklxxccccccccccccccccccccccccccccccccccccccccccccccccc<ccccccccxcxxlllk:::::kklxxcccccccccccccccccccccccccc1 <c<c<c<c<c<c<c<c<c<cc<cc<cccccccccccccccccccccc1 M<ccccccccccccccccccccccccccccccc<ccccccccxcxxlllk:::::kklxxcccccccccccccccccccccccccccccccccccccccccccccccc<cccccccxxcxxlllk:::::kklxxcccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"31<cxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxllllkkklkllxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxllllkkklkllxxxcccccccccccccccccccccccccccc1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<c<c< M<ccccccccccccccccccccccccccccccccccccxxxxxxllllkkklkllxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxlllkkkklkllxxxcccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"31<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxlllxlxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxlllxlxxxxxcccccccccccccccccccccccccccccc1 1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<c1 M<ccccccccccccccccccccccccccccccccccccccxxxxxxlllxlxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxlllxlxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"331<<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxcccccccccccccccccccccccccccccccccc1 1<<1<1111111111111111<11<111<1<1<1<1<1<1<1<<1<<1 M<cccccccccccccccccccccccccccccccccccccccccxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxcxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"z3311<<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1 1<<1<1<1<1111111111111111111111111111111<11<<<<1 M<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"z33311111111111111111111<<<<<<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccBB3<<11111111111111111111111111111111111111<11<<B M<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"zzM731111111113333333333333333333331111111<<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3 M73<111111111111111111111111111111111111111<3B BMcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"zzzM773333333333333333333333333333333333333333111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3MMM7311111111111111111111111111111111111113M BBM1cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"zzzz3MMM7333333333333333333333333333333333333333331111111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc3B BM7311111111111111111111111111111113MB BBM31ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<313MB", +"zzzzzz3BBBBBBBBBBBBBBBBBMMMMMMMM7777773333333333333331313111111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<7B M731111111111111111111111137MB BBM31ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1333BB", +"zzzzzzzz33BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMM77733333331333131311311111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<7MB BM7333111111111337BB BBM31<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1333BB", +"zzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMM7733333333333333311111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<33MMB BBB7771<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<3337BB", +"zzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM77333333333333311111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1133MMMBBBBBBBBB77331<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<3333MB3", +"zzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM7733333333333111111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<133337MBBz", +"zzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM77333333333311111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11333337MBB3z", +"zzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM7733333333311111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11333333337MBB3zz", +"zzzzzzzzzzzzzzzzB7<lkxccccccc1111111377777MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM733333333311111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<133333333337MBBB3zzz", +"zzzzzzzzzzzzzzzz3<xkkxccccccccccccccccccccccccc1111777BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM733333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333333337MBBBB3zzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccc111777BBBBBBBBBBBBBBBBBBBBBBBBBBBBM773333333111111<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133333333377MMBBBB33zzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccc11377BBBBBBBBBBBBBBBBBBBBBBBBBM77333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1333333333377MBBBBB33zzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccc117MBBBBBBBBBBBBBBBBBBBBBBBM73333331111111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133333333377MBBBBBB33zzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccc<137BBBBBBBBBBBBBBBBBBBBBBM7333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133333333337MMBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc177BBBBBBBBBBBBBBBBBBBBMM7333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1333333333377MBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<17MBBBBBBBBBBBBBBBBBBBM73333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333333337MBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBM7333333331111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133333333333MMBBBBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBMM7333333331111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11333333333337MBBBBBBBBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBM73333333311111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<113333333333377MBBBBBBBBBBBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBM73333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<113333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc17MBBBBBBBBBBBBBBBBBMM73333333111111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<113333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc17BBBBBBBBBBBBBBBBBBM773333333111111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<113333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB77333MBzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<37BBBBBBBBBBBBBBBBBBM733333333111111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71cc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc17MBBBBBBBBBBBBBBBBBBM7333333333111111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71<ccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<17BBBBBBBBBBBBBBBBBBBM7733333333111111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11333333333333377MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM31ccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13MBBBBBBBBBBBBBBBBBBBM77333333333111111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11333333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM71ccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc17MBBBBBBBBBBBBBBBBBBBMM73333333333111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<113333333333333377MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71<cccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<xkkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<17BBBBBBBBBBBBBBBBBBBBBM7733333333331111111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333333333333337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71<cccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBMM77333333333311111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<11333333333333333337MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71<cccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBBMM773333333333331111111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1113333333333333333377MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB731cccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBBBMM77333333333333333111111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<111333333333333333333377MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB71<cccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBBBBBMM7733333333333333331111111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<11133333333333333333333377MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM71<cccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBBBBBBBMM7733333333333333333311111111<<<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<111133333333333333333333333377MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB731ccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<17MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM7333333333333333333333333111111111<<<<<<ccccccccccccccccccccccccccccccccccccccccccccccccc<<<<<11111333333333333333333333333333377MMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM71<ccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM7773333333333333333333333333333333311111111111111111<<<<<<<<<<<<111111111111333333333333333333333333333333333333377MMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB731cccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<177BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMM77733333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333777MMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB731ccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<177BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMM77733333333333333333333333333333333333333333333333333333333333333333333377777MMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM731cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMM7777773333333333333333333333333333333333377777777MMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7711ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<137MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMMMMMMMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7711ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<137BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM7711ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1177MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM7711<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc11177MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB77311ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckkxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc113777BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM777111ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1137Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckklccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1113777BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB77777111ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1117Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckklcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11111377777MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB777777771111<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1117Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<ckklcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11111111111111111cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc11117Bzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzz1<<lllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11137Mzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzz1<cxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1113M3zzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzz11<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11137Mzzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzz1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<111117M3zzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzz311<<<11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111337MMzzzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzzz333111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111333333333333333333333333333337MMzzzzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzzzz37331111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111113333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333777777777777777777777777777777777777777777777777777MMMMzzzzzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzzzzz337333333333333333333333333333333333333333333333333333333333333333333777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM3zzzzzzzzzzzzzzzzzzzzz", +"zzzzzzzzzzzzzzzzzzzzzzz33BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3zzzzzzzzzzzzzzzzzzzzzzz" +}; diff --git a/SrcUnix/DefaultSmall.xpm b/SrcUnix/DefaultSmall.xpm new file mode 100644 index 0000000..1ee49bd --- /dev/null +++ b/SrcUnix/DefaultSmall.xpm @@ -0,0 +1,401 @@ +/* XPM */ +static char *DefaultSmall[] = { +/* width height ncolors chars_per_pixel */ +"219 333 61 1", +/* colors */ +" c #000000", +". c #005A31", +"X c #ADADAD", +"o c #082918", +"O c #A5A5A5", +"+ c #525A39", +"@ c #394231", +"# c #002110", +"$ c #738C63", +"% c #7B8C5A", +"& c #738452", +"* c #7B7B7B", +"= c #737373", +"- c #525A42", +"; c #6B6B6B", +": c #636363", +"> c #004A29", +", c #006B39", +"< c #393939", +"1 c #313131", +"2 c #DEDEDE", +"3 c #292929", +"4 c #D6D6D6", +"5 c #212921", +"6 c #007B42", +"7 c #212121", +"8 c #CECECE", +"9 c #182118", +"0 c #5A6B52", +"q c #C6C6C6", +"w c #52634A", +"e c #63734A", +"r c #636B4A", +"t c #9C9C9C", +"y c #949494", +"u c #293121", +"i c #087B42", +"p c #8C8C8C", +"a c #848484", +"s c #737B52", +"d c #425239", +"f c #6B7B4A", +"g c #424A39", +"h c #21945A", +"j c #6B845A", +"k c #5A5A5A", +"l c #525252", +"z c #FFFFFF", +"x c #4A4A4A", +"c c #424242", +"v c #EFEFEF", +"b c #E7E7E7", +"n c #4A4A39", +"m c #5A6342", +"M c #181818", +"N c #101810", +"B c #101010", +"V c #BDBDBD", +"C c #081008", +"Z c #4A5242", +"A c #000800", +/* pixels */ +"zz7<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<3333bz", +"z7aa::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::x<33b", +"7aX*lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll<173", +"7Xpcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<13B", +"M=kccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccck*kcck*kccccccccyatpcc13B", +"M:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc=4z2l=4z2lccccccca*Vqcc13M", +"M:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzcckk*ycc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxtvOcxtvOcccccccccccccc13M", +"M:lccccccpOOOOO*ccccccccccccpO=cccccccccccccccccccccccpV4VpcccccckO44X=cc=4=b:qcccccOOOOOOOOccccccccccccccccccccccccccpO=ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc;t;ccl;kk*kccccccccccc13M", +"M:lccccc18zzzzzz2cccccccccc<8zOcccccccccccccccccccccx2zzzzz2xcccpzzzzzzpccOc4XOcccc1zzzzzzzzccccccccccccccccccccccccc<8zOccccccccccc44:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc=4z2lccc=4z2lcccccccccc13M", +"M:lccccc78z8yyXzzpccccccccc18zOccccccccccccccccccccc8zz*k*zz8ccczzVkkVzzkcOcXqOcccc3zzXyyyyyccccccccccccccccccccccccc<8zOcccccccccc1zz=cccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzcccccccc13M", +"M:lccccc78zt137Ozqcc=V4qpcc18zOckOpkV4*cp4Xkccccccc*zzl1<1xzz*c;zz1<134zycccccccccc3zz:11111cc=O==qq:xO4yxcc=OpcckOOc<8zOccxy44XkcctzzV=cckX4qpccckOpkVpcccccccccccccccccccccccccccccccccccccccccxtvOccccxtvOccccccccccc13M", +"M:lccccc78zOcc3yz4c*zzzzzXc18zOc:z2bzzzXzzzzxccccccyzVcccc1VztclzzOkc<77<cccccccccc3zz=cccccc<tzqzzzzqzzz4cctz8cc;zzc<8zOcc2zzzzzk1zzzztc*zzzzz4cc;z82ztcccccccccccccccccccccccccccccccccccccccccc;t;cck*klccccccccccccc13M", +"M:lccccc78zV==;zzy<4za7azzc18zOckzzyk4zz*;zzpcccccc8ztcccccyz8c38zzzbV*cccccccccccc3zzzzzzz4c<yzz;;zzb;yzzkcyz8cc:zzc<8zOc=zb11bzO37zzk<xzzVk*zzOc:zzby;ccccccccccccccccccccccccccccccccccccccccc=4z2l=4z2lccccccccccccc13M", +"M:lccccc78zzzzzz2x1k:x=Ozzc18zOckzzc<yz8c<8ztccccc<8ztcccccyz8c<1ybzzzz2xcccccccccc3zzzzzzz8c<yz8c18ztc1zz=cyz8cc:zzc<8zOcckkk*bztc1zz=c=zb<c1*z2c:zzc1<ccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzcccccccc13M", +"M:lccccc78zb888acc<:2zzzzzc18zOckzzccyz8cc8ztccccc<XzXcccccOzXcc<37c*XzzXcccccccccc3zzk7777<c<yz4c<8zOc<zz=cyz8cc:zzc<8zOc<Xzzzzztc1zz=cyz8ccc:zzc:zzccccccccccccccccccccccccccccccccccccccccccccxtvOcxtvOcccccccccccccc13M", +"M:lccccc78zy773<ccczzV;;zzc18zOckzzccyz8cc8ztccccc<azbcccccbzpc=Opc<13Oz8cccccccccc3zz=cccccc<yz4c<8zOc<zz=cyz8cc:zzc<8zOcyzzax8ztc1zz=caz8ccc:zzc:zzccccccccccccccccccccccccccccccccccccccccccccc:p:ccl;kcccccccccccccc13M", +"M:lccccc78zOcccccc:zz<<;zzc18zOckzzccyz8cc8ztccccccczzVcccXzzxc=zz:cccVzOcccccccccc3zz=cccccc<yz4c<8zOc<zz=cyzbcctzzc<8zOc8zy<c4ztc1zz=cxzz:ccVzVc:zzcccccccccccccccccccccccccccccccccccccccccccc=4z2lcccccccccccccccccc13M", +"M:lccccc78zOccccccczzy*zzzc18zOckzzccyz8cc8ztcccccc1*zzb4bzz*<c34zz44bzzkcccccccccc3zzzzzzzzO<yz4c<8zOc<zz=cxzzb2zzzc<8zO<Xz2=Xzztc1zz2p3Vzz4bzzkc:zzcccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzcccccccc13M", +"M:lccccc78zOcccccc3Xzzzazz:18zOckzzccyz8cc8ztccccccc3;bzzzb;1cc11Xzzzz4kccccccccccc3zzzzzzzzO<yz4c<8zOc<zz=c3Ozzzkzzc<8zO<xzzz8Xzqc1*zzt<1Ozzzbkcc:zzccccccccccccccccccccccccccccccccccccccccccccxtvOccccccccccccccccccc13M", +"M:lccccc771ccccccc13ck<373c173cc77<cc77<cc77<cccccccc17ckc3<cccc<37kk13<ccccccccccc377777777c<77cc<77cc<77cc<3ck3173c<77cc17kl1371c<377<c<31kx3<cc371ccccccccccccccccccccccccccccccccccccccccccccc:p:ccccccccccccccccccc13M", +"M:lccccccccccccccccc<<ccccccccccccccccccccccccccccccccc<<<cccccccc<<<ccccccccccccccccccccccccccccccccccccccccc<<ccccccccccc<<cccccccccccccc<<<ccccccccccccccccccccccccccccccccccccccccccccccccccc=4z2lcccccccccccccccccc13M", +"M:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzzzzzzzzzzzzzzzzcccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxtvOccccccccccccccccccc13M", +"M:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccl;kccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccc<1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111<cccccccccccccccccccc13M", +"M:lccccccccccccccccccccccc<13333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333311<cccccccccccccccccc13M", +"M:lcccccccccccccccccccccc<337MBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBM311cccccccccccccccccc13M", +"M:lcccccccccccccccccccccc13MNu@dmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmduM3<<ccccccccccccccccc13M", +"M:lcccccccccccccccccccccc37Bg+s%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m3<cccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379+&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ucxccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zxkccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckccccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Zckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%dckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$jZ@@@Zj$$$$$$$$$$$$$$jwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$w9 50$$$$$$$$$$$wN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Cj$$$$$$$$$$juN A5d$$$$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$u @$$$$$$$$$$@Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jA Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$ju Nuu Cw$$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$u u0wg5 u$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@9$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$jN A0$$$d d$$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$@ A0$$j@A g$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$jN Agu u$ju5g d$$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$j Nw$$$$j9 Aj$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$u Nj$$u u5d$$9 Aj$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$u A@j$$$$$$$$5 u$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$j u$Zudw9 Z$$j5 u$$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$A 9j$$$$$$$$$$5 C$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$u 0$0A9jjAAj@A j$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$w u$$$$$$$$$$$$C j$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$N Aj5ZNj$@ Cu Z$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$w u$$$$$$$$$$$$j w$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$ Nj$0jdA ujj @$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$w N$$$$$$$ju j$$g w$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$ u$dN @$uu9 @$$$$%nckxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$w j$$$$$$dA @$$C w$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$ A u0AN5g0u @$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$j $$$$$$Z @$d j$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$A A@j$uu ju95 g$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$CZ$$$$jA @jA N$dZj$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$5 d@uwuZ uu$C 0$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$g59u$@9$$$$@ @9 dju@u0$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$d N$dA@j u$u C$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$5g$$jCg$$$A A C$$9@uj$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$C jjNNdCN9 d$j$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$jw$@g$w d$w A0$Zu0w$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$Zug$Z g9wjdC N$w5gj$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$j5@w0$d @@ AZ$0d@Nj$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$j@$@j$d 5dgC Aj$90u@$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$j0@gu$0C N0$jg9Zw$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$5wZZ0$d Njj@@9w$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$d5@dj$d5 5d$$0duwu$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$jg5uu$$05 C@$$@$uZZ$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$juu5Zd$$$$jwj$$$wj@jwg$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$duNju$$$jd@5@@w$$Z@5jj@$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$5$$ujwj$$$Z5@u0ud0$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$wg@0$Zgj$$$$$$00@g0uuj$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$wu$jduZ@$Njjdj@w$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$jNjj@j@d$Zd$$uu$uj$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$wguj@$j$9u$jg$j$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$0uZZ$$@$@@$$u9wj0$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$j$guZ0guj$j$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$u@0uj@uwju$w$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$j$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$Zg$dZj$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$$$j@9999ud$$$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$$$jd@@@@0$$$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$$ju Ag$$$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$$09 Cd$$$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$$0A uj$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$$@ 9j$$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$$0A 5@wj$$$u5$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$$u Au@uA Nj$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$jC A9j$$$$$$$$u@$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$$Z N0g95w 9$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$@ A9N u$$$$wg@uNAj$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$jA A0N9Z0$ Z$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$$A C5 AwgN g$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$g uu5$$$$ N$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<379f$$$$w 95 u5 Au5 N$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@w$$$$$N @uj$$$g 9 j$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$@ gN95 9d$uZN $$$$$$$$@w$$$$$Zw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j9Nw$@w$$$$$ u$$$$wA5N d$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$@ dC Ndu@$$jg $$$$$$$$@w$00$$uw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Z$$@jj$@w$$$$j gj0u NZ @$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$@ AZNd$0$Z0@ $$$$$$$$@wjwC0$CZj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$N@$u5Aj@w$$$$w 9u uwA @$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$@ @$w9uj$jZA $$$$$$$$@w0uNwduwu$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$gCjj$@j@w$$$$$ NjZjwwjgA g$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$w w5w$j$wZ9 N$$$$$$$$@wguNd5j050@0$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$09u$$du5wdd$@w$$$$$C Njw N9 w$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$A 5$wC@j@C g$$$$$$$$@w$$$$dZgjC0dj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@Z5g0djuj$$$@w$$$$$u Nj0A A$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$@ duj@A Aj$$$$$$$$@w$$$$$$$09$jjj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0$uuu$j$$$$$@w$$$$$w A0jN u$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$jC uZC @$$$$$$$$$@w$$$$$$$$djwCudjj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jgw$j$@$$$$$$$@w$$$$$$5 u0C Aj$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$0A u$$$$$$$$$$@w$$$$$$$$$$9Z$u@C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ud5$Zuj$$$$$$$@w$$$$$$jC Z$$$$$$%nclxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$0A u$$$$$$$$$$$@w$$$$$$$$$$@wjN5j$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Zj0ZNj$$$$$$$$@w$$$$$$$0C d$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$$ju Cd$$$$$$$$$$$$@w$$$$$$$$$$$uCZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9@$$$$$$$$$@w$$$$$$$$ju C0$$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$$j$jg5999uZ$$$$$$$$$$$$$$@w$$$$$$$$$$$0@ANj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$dj$$$$$$$$$@w$$$$$$$$$$0uC A5d$$$$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$jC$j$$$$$$$$g$$$$$$$$$$$$@w$$$$$$$$$$$$5d0@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$j$$$$$$$$$$$$$$$$$$$$$$$$j9ugw0$$$$$$$$$$@w$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$dudCZd0d$Zu$u$$$$$$$$$$$$@w$$$$$$$$$$$$@jAw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$d9$$$$$$$$$$$$$$$$$$$$$$$$$ugu9u$$$$$$$$$$@w$$$$$$$$$$ugjjjjjuuj$$$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$uuudu00ug@d0gj$$$$$$$$$$$@Z$$$$$$$$$$$$jj$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$jC d$$$$$$$$$$$$$$$$$$$$$$$$j$$$w$$$$$$$$$$@w$$$$$$$$$Zu0@Z5wdd$u$$$$$$$$$%nxlxcccccccccccccccc13M", +"M:lccccccccccccccccccccc<179f$$$$$$$$duju@juwNju@j$$$$$$$$$$$wNdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwu CwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgCj$$$$$$$$$@j0@w@@wujd$$$$$$$$$%nxlccccccccccccccccc13M", +"M:lccccccccccccccccccccc<175f$$$$$$$$$$$@@jd$d$$$$$$$$$$$$$$$$j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gj$$$$$$$$$$j$$dwwuwddj$$$$$$$$$%<::ccccccccccccccccc13M", +"M:lcccccccccccccccccccccc13Me$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$rcp=ccccccccccccccccc13M", +"M:lcccccccccccccccccccccc<133-rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-<aO:ccccccccccccccccc13M", +"M:lccccccccccccccccccccccc<1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111<xpXpcccccccccccccccccc13M", +"M:lcccccccccccccccccccccccc<ccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkk:aOpccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccxlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk::lcccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccc<cc<cc<cc<ccccccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccccc<cc<c<c<c<c<cc<cccccccccccccccccccccc<cc<c<c<c<c<cc<cccccccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<c<c<c<c<cc<cccccccccccccccccccccc<cc<c<c<c<c<cc<cccccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccccccc<cc<c<<<<<<c<c<ccc<cccccccccccccccccc<cc<c<<<<<<c<c<ccc<cccccccccccccccccccccccccccccccccccccccccccccccccccc<cc<c<<<<<<c<c<ccc<cccccccccccccccccc<cc<c<<<<<<c<c<ccc<cccccccccccccccccccccc13M", +"M:lcccccccccccccccccccccccccc<c<<<<<<<<<1<<<<<<<c<cccccccccccccccc<c<<<<<<<<<1<<<<<<<c<cccccccccccccccccccccccccccccccccccccccccccccccccc<c<<<<<<<<<1<<<<<<<c<cccccccccccccccc<c<<<<<<<<<1<<<<<<<c<ccccccccccccccccccccc13M", +"M:lccccccccccccccccccccccc<c<c<<<<1111311111<<<c<cccccccccccccc<c<c<<<<1111311111<<<c<cccccccccccccccccccccccccccccccccccccccccccccccc<c<c<<<<1111311111<<<c<cccccccccccccc<c<c<<<<1111311111<<<c<cccccccccccccccccccccc13M", +"M:lcccccccccccccccccccccccc<c<<<11333737333111<<<c<c<ccccccccccc<c<<<11333737333111<<<c<c<ccccccccccccccccccccccccccccccccccccccccccccc<c<<<11333737333111<<<c<c<ccccccccccc<c<<<11333737333111<<<c<c<cccccccccccccccccc13M", +"M:lcccccccccccccccccccccc<<c<111377MMMMMMM773311<<<ccccccccccc<<c<111377MMMMMMM773311<<<ccccccccccccccccccccccccccccccccccccccccccccc<<c<111377MMMMMMM773311<<<ccccccccccc<<c<111377MMMMMMM773311<<<cccccccccccccccccccc13M", +"M:lccccccccccccccccccccc<c<<11377MBBBBBBBBBM73311<<c<c<cccccc<c<<11377MBBBBBBBBBM73311<<c<c<cccccccccccc117MBBBBBBBM711ccccccccccccc<c<<11377MBBBBBBBBBM73311<<c<c<cccccc<c<<11377MBBBBBBBBBM73311<<c<c<cccccccccccccccc13M", +"M111111111111111cccccc<cc<<<137MBBBBBBBCBBBBBM7311<<<ccccccccc<<<137MBBBBBBBCBBBBBM7311<<<ccccccccccc17M711cxxxxxxxc117M71cccccccc<cc<<<137MBBBBBBBCBBBBBM7311<<<ccccccccc<<<137MBBBBBBBCBBBBBM7311<<<cccccccccccccccccc13M", +"BBBBooooooooooo1<cccccc<<<<137MBBBBM33<<<37MBBB7311<c<cccccc<<<<137MBBBBM33<<<37MBBB7311<c<cccccccc171ckkkkkkkkkkkkkkkkkc171ccccccc<<<<137MBBBBM33<<<37MBBB7311<c<cccccc<<<<137MBBBBM33<<<37MBBB7311<c<ccccccccccccccccc13M", +"BBM,iiii666iii>M<ccccccc<<137BBBBM<xllxc<<113BBB7311<ccccc<cc<<137BBBBM<xllxc<<113BBB7311<cc<ccccc71ckkkkkkkkkkkkkkkkkkkkkc17ccccccc<<137BBBBM<xllxc<<113BBB7311<ccccc<cc<<137BBBBM<xllxc<<113BBB7311<cc<ccccccccccccccc13M", +"MMMhiiiiiiiiii>M<ccccc<<<137MBBC3l:=;:kxx<<111MBM711<<c<ccc<c<137MBBC3l:=;:kxx<<111MBM711<<cccccccMlllllllllllllllllllllllll 3cccc<<<137MBBC3l:=;:kxc;<111MBM711<<c<ccc<c<137MBBC3l:=;:kxx<<111MBM711<<ccccccccccccccccc13M", +"77Mhiiiiiiiiii>M<cc<c<c<<13MBBB1:*yyp*tqvvl<111MBM31<<ccc<cc<113MBBB1:*yt8*:kxc<<111MBM31<<cccccccMxxxxxxxxxxxxccccccccccccc 3c<c<c<<13MBBB1:*yyp*X4zzy<111MBM31<<ccc<cc<113MBBB1:*yypO8;xc<<111MBM31<<ccccccccccccccccc13M", +"33Mhiiiiiiiiii>M<cccc<c<137BBB7kpOXOqvzzvO:<1133MB731<cccc<<<137BBB7kpOVVzO;kxc<<1133MB731<cccccccM<<<<<<<<<<<<<<<<<<<<<<<<< 3ccc<c<137BBB7kpOXXqzzzzzz*1133MB731<cccc<<<137BBB7kpOXXq4;pxc<<1133MB731<ccccccccccccccccc13M", +"33Mhiiiiiiiiii>M<cccc<<<13MBBBl*OXqvzzvtx=XO11137BM31<ccccc<<13MBBBl*Oqzq8v:kxc<<11137BM31<cccccccM<<<<<<<111111111111111111 3ccc<<<13MBBBl*OXqvvazzqa4zx1137BM31<ccccc<<13MBBBl*OVV4XOv;:c<xzV137BM31<ccccccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccc<c<137MBB3kpO4zzzXkpkXzz:1133MB31<ccc<c<117MBB3kpO8zvtz;lxc<<11133MB31<cccccccM1111111111111111111111111 3cc<c<137MBB3kpXbzz4t4=kXbz41133MB31<ccccc<117MBB3kpX48X4;z4z;<4xV=33MB31<ccccccccccccccccc13M", +"33Mhiiiiiiiiii>M<cccc<<137BBCx:pVzz4*avz4<V:x11337C71<cxcc<<137BBCx:pttzzV:klcc<<111337BM1<cxcccccM3333333333333333333333333 3ccc<<137BBBc;avzv4p8vqzzzzz=1337BM1<cxcc<<137BBCx:p4qqpvVzv4v;O14k337BM1<cxccccccccccccccc13M", +"33Mhiiiiiiiiii>M<c<c<c<137BB7x:*pXO*pazz4l<Ozk3337BM1<cxcc<<137BB7x:*ppvz8:kxcc<1113337BM11cxcccccM7777777777777777777777777 3cc<c<137BBMx:*yzvp:8zzzz4=z43337BM11cxcc<<137BB7x:*yv4XzvOx;zz::t3137BM11cxccccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccc<<<13MBB7ck===*VOkOalXxOzO1337BB1<cxcc<<13MBB7c:===Vzzklxc1<1111337BB1<xxxccccMB B3ccc<<13MBB3ck=*yzzz4:Xv*xOzzk337BB1<xxccc<13MBB7ck==yzz8;*q44V14c3337BB1<xxxcccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccccc<137BB3cl:::k;Xqtl*zOxp3c337MB1<xlccc<137BB3cl:::;zzpxc<<11113337MB1<xlccccccc33333333333333333333333331ccc<<13MBB3cl:::XzXlal4OzzzzO337MB1<xlccc<137BB3cl:::O4lXv;<4k=O11337MB1<xlccccccccccccccc13M", +"33Mhiiiiiiiiii>M<c<c<<<13MBB3<xllkpzzv4z*=41cv=337MB1<xlcc<<13MBB3<xllkl4zvl1**11113337MC1<xlxcccccccccccccccccccccccccccccccccc<<<137BB3<xllllvXa414zzzzz8337MC1<xlxc<<13MBB3<xlklx4zX<kvb14x33337MC1<xlxcccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccc<c<137BB3<ccx=zzz*yzvc1cpz=377BB1<lkxc<<137BB3<ccxxxlvzz*pz=1133377BB1<lkxcccccccccccccccccccccccccccccccccc<c<137BC3<ccxxxyz<lXzzz4cpz377BB1<lkxcc<137BB3<ccxxx;vlV4VO=zc33377BB1<lkxcccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccc<<<137BBM<<ccVzVzxVzzp=p=8c777BM<c:kccc<137BBM<<cccc<*zzz=Vb3133377BM<ck:xcccccccccccccccccccccccccccccccccc<c<137BBM<<ccccc4Vbpkz=cVz8377BM<ck:xc<<<37BBM<<cccc<Xzp1bkvzO33377BM<ck:xcccccccccccccc13M", +"33Mhiiiiiiiiii>M<c<ccc<<13MBB1<1<zzl<1bzzV=Vc3337MB7<x;kxc<<<13MBB1<1<<<<<*zzvc4133377MB7<x;kcccccccccccccccccccccccccccccccccccc<<<13MBB11<<<<<yzxkxV4bz8c77MB7<x;kccc<113MBB1<1<<<<x4xVbpzzV3377MB7<x;kccccccccccccccc13M", +"33Mhiiiiiiiiii>M<cccc<<<13MBB31<14zzvVzzzVkc3377MMB3<k=kccc<<13MBB31<1<1<11:bzV3c33377MB3<k=kxccccccccccccccccccccccccccccccccc<cc<<13MBB3<1<1<1xzxOcpzzO3777MB3<k=kccc<<13MBB311<1<114zzzzzXc3377MB3<k=kxcccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccc<c<<137MBB111pzzzzzzzk333377MBM<c==lcc<c<137MBB111111111cpbzv3377MBM<c==lcccccccccccccccccccccccccccccccccccc<c<137MBB1111111z=1pb8k7377MBM<c==lccc<<133MCM1111111=zzzz=33777MBM<c==lccccccccccccccc13M", +"33Mhiiiiiiiiii>M<ccccc<<<137BB7111bzzzzzV3333777BB3cka;xccc<<<137BB71111113133c88;777BB3cka;xcccccccccccccccccccccccccccccccccccc<<<<137BB7111111zb4bp333777BB3cka;xcc<c<<137BB71111111zzVc333777BB3cka;xccccccccccccccc13M", +"33M.,,,,,,,,,,>M<ccc<cc<<133MBB333cOzzbp333377MBB7<x*akcc<cc<<133MBB33131313333=t=7MBB7<x*akccccccccccccccccccccccccccccccccccccccc<<133MBB331313z8p333377MBB7<x*akccccc<<1337BB3313133Ok333777MBB7<x*akcccccccccccccccc13M", +"33M############1<ccccc<c<<133MBB73333337337777BBM<c;y;xcccc<c<<133MBB7333333333777MBBM<c;y;xcccccc1MMMMMMMMMMMMMMMMMMMMMMMMM1<c<cc<c<<133MBB73333c37337777BBM<c;y;xcccc<c<<117MBB7333333333777MMBM<c;y;xcccccccccccccccc13M", +"<<<<<<<<<<<<<<<<cccccccc<<<133MBBM3333337777MBBM<c:t*kcccccc<<<<133MBBM3333377777MBBM<c:t*kcccccccMxxxxxxxxxxxxxcccccccccccc 1ccccc<<<<133MBBM3333337777MBBM<c:t*kccccccc<<1133MBBM3333377777MBBM<c:t*kccccccccccccccccc13M", +"3:lccccccccccccccccccc<cc<<<1137MBBM77777MMBBB7<c:yp:xcccccccc<<<1137MBBM77777MMBBB7<c:yp:xcccccccMkkkkkkkkkkkkkkkkkkkkkkkkl 3ccccccc<<<1137MBBM77777MMBBB7<c:yp:xcccccc<c<<<1137MBBM77777MMBBB7<c:yp:xccccccccccccccccc13M", +"3:lcccccccccccccc<cccccc<c<<111337MBCBBBBBBB71<c:yp;xcccccccc<c<<111337MBCBBBBBBB71<c:yp;xccccccccMkkkkkkkkkkkkkkkkkkkkkkkkk 3cccc<c<c<<111337MBCBBBBBBB71<c:yp;xcccccccccc<<111337MBCBBBBBBB71<c:yp;xcccccccccccccccccc13M", +"3:lccccccccccccccccccccccc<c<<1111337MMMM731<cx=yp;xccccccccccc<c<<1111337MMMM731<cx=yp;xcccccccccMlllllllllllllllllllllllll 3cccccccc<c<<1111337MMMM731<cx=yp;xccccccccc<c<c<<1111337MMMM731<cx=yp;xccccccccccccccccccc13M", +"3:lcccccccccccccccccccc<cc<c<<<<11111111<<<cckap*kxccccccccc<cc<c<<<<11111111<<<cckap*kxccccccccccMcccccccccccccxxxxxxxxxxxx 3ccccccc<c<c<<<11111111<<<cckap*kxcccccccccccc<c<<<<11111111<<<cckap*kxcccccccccccccccccccc13M", +"3kxcccccccccccccccccccccccccccc<c<<<<<<<ccxk=*=:lxcccccccccccccccccc<c<<<<<<<ccxk=**:lxcccccccccccM<<<<<<<<<<<<<<<<<<<<<<<<< 3cccccccccc<cc<c<<<<<<<ccxk=*=:lxcccccccccccccccccc<c<<<<<<<ccxk=**:lxccccccccccccccccccccc13M", +"3lccccccccccccccccccccccccc<c<cccccccxxllk;;;:lxcccccccccccccccc<c<cccccccxxllk;;;:lxcccccccccccccM111111111111111111<<<<<<1 3ccccccccccc<cccccccxxllk;;;:lxcccccccccccccccc<c<cccccccxxllk;;;:lxccccccccccccccccccccccc13M", +"3<<ccccccccccccccccccccc<cccccccccccxxxlllllxcccccccccccccccc<cccccccccccxxxlllllxcccccccccccccccc7M11111111111111111111117C 3ccccccccccccccccccxxxlllllxcccccccccccccccc<cccccccccccxxxlllllxcccccccccccccccccccccccccc13M", +"331111111111111<<<<<<cccccccccc<cccccccxccxccccccccccccccccccccccccc<cccccccxccxccccccccccccccccccc1MM733333333333333337MC M<ccccccccccccc<cccccccxccxccccccccccccccccccccccccc<cccccccxccxcccccccccccccccccccccccccccc13M", +"z37333333333333333333333111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc17MMM777777777MMCC B71cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13M", +"zz37BBBBBBBBMMMMMMM777733333333111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13MBB CBM71ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc13B", +"zzzzzzzzBBBBBBBBBBBBBBBBBBMM77733331111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<<<<<<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<37B", +"zzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBMM77333111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<137B7", +"zzzzzzzzM377777777BBBBBBBBBBBBBBBBBBBBMM73331111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<13337BB7z", +"zzzzzzzz3:lcccccccccccc111377MBBBBBBBBBBBBBM7733311<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133337BB7zzz", +"zzzzzzzz3:lccccccccccccccccccccc1137MBBBBBBBBBBM7733111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<133337MBBB7zzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccc117MBBBBBBBBBM7333111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133337BBBBM7zzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccc117BBBBBBBBBM733311<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<1133337MBBBBBBBMzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccc<17BBBBBBBBM7733311<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<133337MMBBBBBBBBBBMzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccccccc<17BBBBBBBBM7333111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1333377MBBBBBBBBBBBBBBMzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccccccccccc<37BBBBBBBBM7333111<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11333377MBBBBBBBBBBBBBBM733Mzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccccccccccccccc17MBBBBBBBMM73333111<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<13333377MBBBBBBBBBBBBBBB71<cc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccc<17BBBBBBBBBM73333311<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<11333337MMBBBBBBBBBBBBBBB731cccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBM7733333111<<<cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<1133333377MBBBBBBBBBBBBBBBB731cccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBM77333333111<<<ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<<<11333333377MBBBBBBBBBBBBBBBBB731cccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBMM7733333333111<<<<ccccccccccccccccccccccccccccccccccccccccccc<<<<1113333333377MMBBBBBBBBBBBBBBBBBB731cccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc117BBBBBBBBBBBBBBMM7733333333333111111<<<<<<<<<ccccccc<<<<<<<<<<111113333333333377MMMBBBBBBBBBBBBBBBBBBBM71<cccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc137BBBBBBBBBBBBBBBBMMM77773333333333333333333333333333333333333337777MMMBBBBBBBBBBBBBBBBBBBBBBM711ccccccccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1177BBBBBBBBBBBBBBBBBBBBBMMMMMM7777777777777777777MMMMMMBBBBBBBBBBBBBBBBBBBBBBBBBBBB731<cccccccccccccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc1177BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7731<cccccccccccccccccccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11777BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB777111ccccccccccccccccccccccccccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3:lcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<11177777BBBBBBBBBBBBBBBBBBBBBBBBBBB777771111cccccccccccccccccccccccccccccccccccccccccccccccccccccc<1Mzzzzzzzz", +"zzzzzzzz3klcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc111111111cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc11Mzzzzzzzz", +"zzzzzzzz3lxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc<13Mzzzzzzzz", +"zzzzzzzz37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<111M7zzzzzzzz", +"zzzzzzzzz7711111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111113333333333333333333333333333333333333333333333333333333333333333333333333337MMzzzzzzzzz", +"zzzzzzzzzz37777777777777777777777777777777MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM7zzzzzzzzzz" +}; diff --git a/SrcUnix/EmApplicationFltk.cpp b/SrcUnix/EmApplicationFltk.cpp new file mode 100644 index 0000000..085f4b5 --- /dev/null +++ b/SrcUnix/EmApplicationFltk.cpp @@ -0,0 +1,494 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmApplicationFltk.h" + +#include "EmDlgFltk.h" // HandleDialogs +#include "EmDocument.h" // gDocument +#include "EmMenus.h" // MenuInitialize +#include "EmWindowFltk.h" + +#include <FL/Fl.H> // Fl::wait +#include <FL/x.H> // fl_display +#include <FL/Fl_Widget.h> + +#ifdef __QNXNTO__ +#include <sys/neutrino.h> +#endif + +EmApplicationFltk* gHostApplication; + +// These variables are defined in Platform_Unix.cpp. + +const double kClipboardFreq = 0.1; +extern ByteList gClipboardDataPalm; +extern ByteList gClipboardDataHost; +extern omni_mutex gClipboardMutex; +extern omni_condition gClipboardCondition; +extern Bool gClipboardHaveOutgoingData; +extern Bool gClipboardNeedIncomingData; +extern Bool gClipboardPendingIncomingData; +extern Bool gClipboardHaveIncomingData; + +// Little private widget used solely for receiving notification +// that clipboard data has arrived. + +class EmClipboardWidget : public Fl_Widget +{ +public: + EmClipboardWidget () : Fl_Widget (0, 0, 0, 0) {} + virtual ~EmClipboardWidget () {}; + int handle (int); + void draw (void) {} +}; + + +/*********************************************************************** + * + * FUNCTION: main + * + * DESCRIPTION: Application entry point. Creates the preferences and + * then the application object. Uses the application + * object to initizalize, run, and shutdown the system. + * A top-level exception handler is also installed in + * order to catch any wayward exceptions and report them + * to the user with a Fatal Internal Error message. + * + * PARAMETERS: Standard main parameters + * + * RETURNED: Zero by default. If a non-fatal error occurred, returns + * 1. If a fatal error occurred while running a Gremlin, + * returns 2. This is handy for Palm's automated testing. + * + ***********************************************************************/ + +int main (int argc, char** argv) +{ + EmulatorPreferences prefs; + EmApplicationFltk theApp; + + try + { + if (theApp.Startup (argc, argv)) + { + theApp.Run (); + } + } + catch (...) + { + // !!! TBD +// ::MessageBox (NULL, "Palm OS Emulator: Fatal Internal Error", +// "Fatal Error", MB_OK); + } + + theApp.Shutdown (); + + return + gErrorHappened ? 2 : + gWarningHappened ? 1 : 0; +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::EmApplicationFltk + * + * DESCRIPTION: Constructor. Sets the globalhost application variable + * to point to us. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmApplicationFltk::EmApplicationFltk (void) : + EmApplication (), + fAppWindow (NULL) +{ + EmAssert (gHostApplication == NULL); + gHostApplication = this; +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::~EmApplicationFltk + * + * DESCRIPTION: Destructor. Closes our window and sets the host + * application variable to NULL. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmApplicationFltk::~EmApplicationFltk (void) +{ + delete fAppWindow; + + EmAssert (gHostApplication == this); + gHostApplication = NULL; +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::Startup + * + * DESCRIPTION: Performes one-time startup initialization. + * + * PARAMETERS: argc, argv from main() + * + * RETURNED: Nothing + * + ***********************************************************************/ + +Bool EmApplicationFltk::Startup (int argc, char** argv) +{ +#ifdef __QNXNTO__ + // speed NTO up so the timing will be about right (for an x86 anyway) + struct _clockperiod cpnew; + struct _clockperiod old; + + cpnew.nsec = 5000000; + cpnew.fract = 0; + ClockPeriod(CLOCK_REALTIME, &cpnew, &old, 0); +// printf ("%d %d %d\n", old.nsec, old.fract); +#endif + + // Initialize the base system. + + if (!EmApplication::Startup (argc, argv)) + return false; + + // Create our window. + + this->PrvCreateWindow (argc, argv); + + // Start up the sub-systems. + + ::MenuInitialize (false); + + // Start the clipboard idling. + // !!! Get rid of this special clipboard window. I think that + // we can roll this functionality into fAppWindow. + + (void) this->PrvGetClipboardWidget (); + + return true; +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::Run + * + * DESCRIPTION: Generally run the application. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmApplicationFltk::Run (void) +{ + this->HandleStartupActions (); + + while (1) + { + Fl::wait (0.1); + + if (this->GetTimeToQuit ()) + break; + + this->HandleIdle (); + } +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::Shutdown + * + * DESCRIPTION: Performs one-time shutdown operations. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmApplicationFltk::Shutdown (void) +{ + // Delete our window now, so that its position will be recorded + // in the preferences before EmApplication::Shutdown saves them. + + delete fAppWindow; + fAppWindow = NULL; + + // Perform common shutdown. + + EmApplication::Shutdown (); +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::HandleIdle + * + * DESCRIPTION: Perform idle-time operations. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmApplicationFltk::HandleIdle (void) +{ + // Idle the clipboard. Do this first, in case the CPU + // thread is blocked waiting for the data. + + if (!this->PrvIdleClipboard ()) + return; // CPU thread is still blocked. + + // Handle any modeless dialogs + + ::HandleDialogs (); + + EmApplication::HandleIdle (); +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::PrvCreateWindow + * + * DESCRIPTION: Create the window that displays the LCD/skin stuff, + * or the message saying to right-click to show a menu. + * + * PARAMETERS: argc, argv from main() + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmApplicationFltk::PrvCreateWindow (int argc, char** argv) +{ + Fl::visual (FL_RGB); + + fAppWindow = new EmWindowFltk; + fAppWindow->WindowInit (); + fAppWindow->show (argc, argv); +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::PrvClipbardPeriodic + * + * DESCRIPTION: Idle time routine called when it's time to check to + * see if there are any clipboard tasks to perform. + * Handles those tasks and then queues up another + * callback into us. + * + * PARAMETERS: data - value passed in to Fl::add_timeout when this + * function was queued up for execution. + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmApplicationFltk::PrvClipboardPeriodic (void* data) +{ + EmApplicationFltk* This = (EmApplicationFltk*) data; + (void) This->PrvIdleClipboard (); + Fl::add_timeout (kClipboardFreq, &PrvClipboardPeriodic, This); +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::PrvGetClipboardWidget + * + * DESCRIPTION: Return the widget being used to receive the message + * that clipboard data has arrived. This clipboard is + * created on demand. + * + * PARAMETERS: None + * + * RETURNED: Pointer to the "clipboard widget". + * + ***********************************************************************/ + +Fl_Widget* EmApplicationFltk::PrvGetClipboardWidget (void) +{ + if (!fClipboardWidget) + { + fClipboardWidget = new EmClipboardWidget; + Fl::add_timeout (kClipboardFreq, &PrvClipboardPeriodic, this); + } + + return fClipboardWidget; +} + + +/*********************************************************************** + * + * FUNCTION: EmApplicationFltk::PrvIdleClipboard + * + * DESCRIPTION: Check to see if there is any incoming or outgoing + * clipboard data and handle it if there is. + * + * PARAMETERS: None + * + * RETURNED: TRUE if there is pending incoming data. This helps + * prevent us from deadlocking with the CPU thread, since + * it's now blocked on us waiting for data. + * + ***********************************************************************/ + +Bool EmApplicationFltk::PrvIdleClipboard (void) +{ + omni_mutex_lock lock (gClipboardMutex); + + // See if there's anything outgoing. + + if (gClipboardHaveOutgoingData) + { + // Get the widget that FLTK requires for clipboard management. + + Fl_Widget* w = this->PrvGetClipboardWidget (); + EmAssert (w); + + // Tell FLTK the data to make available to other X programs if they need + // to know the current selection. We make a local copy of the data in + // case ... <something about race conditions>. + + fClipboardData = gClipboardDataHost; + + Fl::selection (*w, (const char*) &fClipboardData[0], (int) fClipboardData.size ()); + + // Clear the flag saying that we changed the clipboard. + + gClipboardHaveOutgoingData = false; + } + + // See if there's a request for incoming data. + + if (gClipboardNeedIncomingData) + { + // Clear the flag saying that we need to ask for the + // current selection. + + gClipboardNeedIncomingData = false; + + // FLTK only sends a FL_PASTE event if a selection exists. If there + // is no selection, we note that ourselves instead of waiting for an + // event that will never arrive. + // + // !!! Do we get a FL_PASTE event if there is a primary selection + // but it can't be converted to XA_STRING? We might still wait + // forever in that case. + + if (XGetSelectionOwner (fl_display, XA_PRIMARY) != None) + { + gClipboardPendingIncomingData = true; + + // Get the widget that FLTK requires for clipboard management. + + Fl_Widget* w = PrvGetClipboardWidget (); + EmAssert (w); + + // Our clipboard widget may get called in this + // context. It will try to acquire the clipboard + // mutex, so give it up here. + + omni_mutex_unlock unlock (gClipboardMutex); + + // Tell FLTK to get the clipboard data. Usually, this will + // require sending a request to the X server to get the + // data from the application holding the current selection. + // When the remote application responds, we'll get notified + // via an FL_PASTE event sent to our widget's handle() method. + + Fl::paste (*w); + } + else + { + gClipboardHaveIncomingData = true; + gClipboardCondition.broadcast (); + } + } + + return !gClipboardPendingIncomingData; +} + + +/*********************************************************************** + * + * FUNCTION: EmClipboardWidget::handle + * + * DESCRIPTION: Handle the event indicating that clipboard data has + * arrived from the selection owner. + * + * PARAMETERS: event - number indicating the event that occurred. + * + * RETURNED: Non-zero if we handled the event. + * + ***********************************************************************/ + +int EmClipboardWidget::handle (int event) +{ + // It's a "paste" event, meaning that our application has requested + // data to paste, and it just showed up from the X server. + + if (event == FL_PASTE) + { + // Get exclusive access to our clipboard data. + + omni_mutex_lock lock (gClipboardMutex); + + // Say that the data is here. + + gClipboardPendingIncomingData = false; + gClipboardHaveIncomingData = true; + + // Copy the data to the host data clipboard. The Palm-specific + // clipboard will remain empty, and the host data will get + // convert to it on demand. + + gClipboardDataPalm.clear (); + gClipboardDataHost.clear (); + + copy ((char*) Fl::e_text, + (char*) Fl::e_text + Fl::e_length, + back_inserter (gClipboardDataHost)); + + // Tell the CPU thread that the new data is here. + + gClipboardCondition.broadcast (); + + // Return that we handled the event. + + return 1; + } + + // Return that we didn't handle the event. + + return 0; +} diff --git a/SrcUnix/EmApplicationFltk.h b/SrcUnix/EmApplicationFltk.h new file mode 100644 index 0000000..c1120a6 --- /dev/null +++ b/SrcUnix/EmApplicationFltk.h @@ -0,0 +1,50 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmApplicationFltk_h +#define EmApplicationFltk_h + +#include "EmApplication.h" // EmApplication +#include "EmStructs.h" // ByteList + +class EmWindowFltk; +class Fl_Widget; + +class EmApplicationFltk : public EmApplication +{ + public: + EmApplicationFltk (void); + virtual ~EmApplicationFltk (void); + + public: + virtual Bool Startup (int argc, char** argv); + void Run (void); + virtual void Shutdown (void); + void HandleIdle (void); + + private: + void PrvCreateWindow (int argc, char** argv); + + Bool PrvIdleClipboard (void); + static void PrvClipboardPeriodic (void* data); + Fl_Widget* PrvGetClipboardWidget (void); + + private: + EmWindowFltk* fAppWindow; + Fl_Widget* fClipboardWidget; + ByteList fClipboardData; +}; + +extern EmApplicationFltk* gHostApplication; + +#endif // EmApplicationFltk_h diff --git a/SrcUnix/EmCommonUnix.h b/SrcUnix/EmCommonUnix.h new file mode 100644 index 0000000..87e75ac --- /dev/null +++ b/SrcUnix/EmCommonUnix.h @@ -0,0 +1,90 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmUnixCommon_h +#define EmUnixCommon_h + +// Common header file included by all Palm OS Emulator for UNIX files. + +// Define this before anything else, especially anything that can pull in +// an STL header. gcc-2.95.2 has a problem instantiating vector<ptmf> +// classes, which we use in EmRegs. When it gets around to instantiating +// the allocator class to be used with the vector, the compiler complains +// that alloc::address (an allocator function) is already instantiated. +// By defining this macro, we appear to avoid that problem. + +#define __STL_USE_SGI_ALLOCATORS + + +// Palm headers + +#include "Palm.h" + + +// Std C/C++ Library stuff + +// Don't pull these in here. These would be brought in for *every* +// file, which is too expensive. We can do this on other platforms, +// as EmCommon.h is the basis for the precompiled header files, +// which load in quickly even with lots of extra stuff in them. + +//#include <ctype.h> // isalpha, tolower +//#include <stdarg.h> +//#include <stddef.h> +//#include <stdio.h> +//#include <stdlib.h> +//#include <string.h> + +//#include <sys/types.h> +//#include <sys/socket.h> +//#include <sys/ioctl.h> +//#include <netinet/in.h> +//#include <netinet/tcp.h> +//#include <netdb.h> + +//#include <algorithm> // find, sort +//#include <deque> // deque +//#include <list> // list +//#include <string> // list +//#include <utility> // pair +//#include <vector> +//#include <map> + + +#define down fl_down // "down" defined both in WindowNew.h and Fl/Enumerations.h + + +// ============================================ +// ========== Windows socket mapping ========== +// ============================================ + +#include <sys/types.h> +#include <sys/socket.h> // socklen_t + +#if !defined(HAVE_TYPE_SOCKLEN_T) + typedef int socklen_t; // not defined in <sys/socket.h> on solaris or FreeBSD +#endif + +typedef int SOCKET; + +#define WSAEINVAL EINVAL +#define INVALID_SOCKET ((SOCKET) (~0)) +#define SOCKET_ERROR (-1) +#define closesocket close +#define ioctlsocket ioctl + +#ifndef INADDR_LOOPBACK +#define INADDR_LOOPBACK 0x7f000001 +#endif + +#endif /* EmUnixCommon_h */ diff --git a/SrcUnix/EmDirRefUnix.cpp b/SrcUnix/EmDirRefUnix.cpp new file mode 100644 index 0000000..5d93d1d --- /dev/null +++ b/SrcUnix/EmDirRefUnix.cpp @@ -0,0 +1,506 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmDirRefUnix.h" + +#include "EmFileRef.h" +#include "Platform.h" + +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <dirent.h> + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::EmDirRef + * + * DESCRIPTION: Various ways to make a directory reference. + * + * PARAMETERS: none. + * + * RETURNED: nothing. + * + ***********************************************************************/ + +EmDirRef::EmDirRef (void) : + fDirPath () +{ +} + + +EmDirRef::EmDirRef (const EmDirRef& other) : + fDirPath (other.fDirPath) +{ +} + + +EmDirRef::EmDirRef (const char* path) : + fDirPath (path) +{ + this->MaybeAppendSlash (); +} + + +EmDirRef::EmDirRef (const string& path) : + fDirPath (path) +{ + this->MaybeAppendSlash (); +} + + +EmDirRef::EmDirRef (const EmDirRef& parent, const char* path) : + fDirPath (parent.GetFullPath () + path) +{ + this->MaybeAppendSlash (); +} + + +EmDirRef::EmDirRef (const EmDirRef& parent, const string& path) : + fDirPath (parent.GetFullPath () + path) +{ + this->MaybeAppendSlash (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::EmDirRef + * + * DESCRIPTION: EmDirRef destructor. Nothing special to do... + * + * PARAMETERS: none. + * + * RETURNED: nothing. + * + ***********************************************************************/ + +EmDirRef::~EmDirRef (void) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::operator= + * + * DESCRIPTION: Assignment operator. If "other" is not the same as + * the controlled object, copy the contents. + * + * PARAMETERS: other - object to copy. + * + * RETURNED: reference to self. + * + ***********************************************************************/ + +EmDirRef& +EmDirRef::operator= (const EmDirRef& other) +{ + if (&other != this) + { + fDirPath = other.fDirPath; + } + + return *this; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::IsSpecified + * + * DESCRIPTION: Returns whether or not the controlled object has been + * pointed to a (possibly non-existant) file, or if it's + * empty (that it, it was created with the default ctor). + * + * PARAMETERS: none. + * + * RETURNED: True if the object points to a file. + * + ***********************************************************************/ + +Bool +EmDirRef::IsSpecified (void) const +{ + return !fDirPath.empty (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::Exists + * + * DESCRIPTION: Returns whether or not the controlled object points to + * an existing file. + * + * PARAMETERS: none. + * + * RETURNED: True if the referenced file exists. + * + ***********************************************************************/ + +Bool +EmDirRef::Exists (void) const +{ + if (this->IsSpecified ()) + { + DIR* dir = opendir (fDirPath.c_str ()); + if (dir) + { + closedir (dir); + return true; + } + } + + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::Create + * + * DESCRIPTION: Attempt to create the managed directory. Does nothing + * if the directory already exists. Throws an exception + * if the attempt to create the directory fails. + * + * PARAMETERS: none. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void +EmDirRef::Create (void) const +{ + if (!this->Exists () && this->IsSpecified ()) + { + // Make sure all directories down to us are created, too. + + EmDirRef parent = this->GetParent (); + parent.Create (); + + if (mkdir (fDirPath.c_str (), 0777) != 0) + { + // !!! throw... + } + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetName + * + * DESCRIPTION: Returns the name of the referenced file. Only the file + * *name* is returned, not the full path. + * + * PARAMETERS: none. + * + * RETURNED: A string containing the name. If the file is not + * specified, an empty string is returned. No checks are + * made to see if the file actually exists. + * + ***********************************************************************/ + +string +EmDirRef::GetName (void) const +{ + string result; + + if (this->IsSpecified () && fDirPath != "/") + { + // Make a copy of the path, and chop off the trailing '\' + // in order to get _splitpath to think the thing at the + // end is a file name. + + string dirPath (fDirPath); + dirPath.resize (dirPath.size () - 1); + + string::size_type pos = dirPath.rfind ('/', string::npos); + EmAssert (pos != string::npos); + + result = dirPath.substr (pos + 1, string::npos); + } + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetParent + * + * DESCRIPTION: Returns an object representing the parent (or container) + * of the managed file. If the managed file is the root + * directory, returns an unspecified EmDirRef. + * + * PARAMETERS: none. + * + * RETURNED: An object representing the file's parent. + * + ***********************************************************************/ + +EmDirRef +EmDirRef::GetParent (void) const +{ + EmDirRef result; + + if (this->IsSpecified () && fDirPath != "/") + { + // Make a copy of the path, and chop off the trailing '\' + // in order to get _splitpath to think the thing at the + // end is a file name. + + string dirPath (fDirPath); + dirPath.resize (dirPath.size () - 1); + + string::size_type pos = dirPath.rfind ('/', string::npos); + EmAssert (pos != string::npos); + + result = EmDirRef (dirPath.substr (0, pos + 1)); + } + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetFullPath + * + * DESCRIPTION: Get a full (platform-specific) path to the object. The + * path is canonicalized in that it will always have a + * trailing slash. + * + * PARAMETERS: none. + * + * RETURNED: An string representing the file's path. + * + ***********************************************************************/ + +string +EmDirRef::GetFullPath (void) const +{ + return fDirPath; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetChildren + * + * DESCRIPTION: Get a full (platform-specific) path to the object. The + * path is canonicalized in that it will always have a + * trailing slash. + * + * PARAMETERS: none. + * + * RETURNED: An string representing the file's path. + * + ***********************************************************************/ + +void +EmDirRef::GetChildren (EmFileRefList* fileList, EmDirRefList* dirList) const +{ + DIR* dir = opendir (fDirPath.c_str ()); + if (dir) + { + struct dirent* ent; + while ((ent = readdir (dir)) != NULL) + { + if (strcmp (ent->d_name, ".") == 0) + continue; + + if (strcmp (ent->d_name, "..") == 0) + continue; + + string full_path (fDirPath + ent->d_name); + struct stat buf; + stat (full_path.c_str (), &buf); + + if (S_ISDIR (buf.st_mode)) + { + if (dirList) + dirList->push_back (EmDirRef (*this, ent->d_name)); + } + else + { + if (fileList) + fileList->push_back (EmFileRef (*this, ent->d_name)); + } + } + + closedir (dir); + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::operator== + * FUNCTION: EmDirRef::operator!= + * FUNCTION: EmDirRef::operator> + * FUNCTION: EmDirRef::operator< + * + * DESCRIPTION: Bogus operators for wiggy VC++ compiler which won't let + * us instantiate STL containers without them. + * + * PARAMETERS: other - object to compare ourself to. + * + * RETURNED: True if the requested condition is true. Comparisons + * are based on the file's full path. + * + ***********************************************************************/ + +bool +EmDirRef::operator== (const EmDirRef& other) const +{ + return _stricmp (fDirPath.c_str (), other.fDirPath.c_str ()) == 0; +} + + +bool +EmDirRef::operator!= (const EmDirRef& other) const +{ + return _stricmp (fDirPath.c_str (), other.fDirPath.c_str ()) != 0; +} + + +bool +EmDirRef::operator> (const EmDirRef& other) const +{ + return _stricmp (fDirPath.c_str (), other.fDirPath.c_str ()) < 0; +} + + +bool +EmDirRef::operator< (const EmDirRef& other) const +{ + return _stricmp (fDirPath.c_str (), other.fDirPath.c_str ()) > 0; +} + + +/*********************************************************************** + * + * FUNCTION: FromPrefString + * + * DESCRIPTION: Initialize this object from the string containing a file + * reference stored in a preference file. + * + * PARAMETERS: s - the string from the preference file + * + * RETURNED: True if we were able to carry out the initialization. + * False otherwise. Note that the string is NOT validated + * to see if it refers to an existing file. + * + ***********************************************************************/ + +bool +EmDirRef::FromPrefString (const string& s) +{ + fDirPath = s; + this->MaybeAppendSlash (); + + return true; +} + + +/*********************************************************************** + * + * FUNCTION: ToPrefString + * + * DESCRIPTION: Produce a string that can be stored to a preference file + * and which can later be used to reproduce the current + * file reference object. + * + * PARAMETERS: None + * + * RETURNED: The string to be written to the preference file. + * + ***********************************************************************/ + +string +EmDirRef::ToPrefString (void) const +{ + return fDirPath; +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetEmulatorDirectory + * + * DESCRIPTION: Return an EmDirRef for Poser's directory. + * + * PARAMETERS: None + * + * RETURNED: The desired EmDirRef. + * + ***********************************************************************/ + +EmDirRef +EmDirRef::GetEmulatorDirectory (void) +{ + const char* dir = getenv ("POSER_DIR"); + + if (dir == NULL) + dir = getenv ("HOME"); + + return EmDirRef (dir); +} + + +/*********************************************************************** + * + * FUNCTION: EmDirRef::GetPrefsDirectory + * + * DESCRIPTION: Return an EmDirRef for Poser's preferences directory. + * + * PARAMETERS: None + * + * RETURNED: The desired EmDirRef. + * + ***********************************************************************/ + +EmDirRef +EmDirRef::GetPrefsDirectory (void) +{ + return GetEmulatorDirectory (); +} + + +/*********************************************************************** + * + * FUNCTION: MaybeAppendSlash + * + * DESCRIPTION: Append a trailing slash to the full path if there isn't + * one already there. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void +EmDirRef::MaybeAppendSlash (void) +{ + if (this->IsSpecified () && fDirPath[fDirPath.size () - 1] != '/') + { + fDirPath += '/'; + } +} diff --git a/SrcUnix/EmDirRefUnix.h b/SrcUnix/EmDirRefUnix.h new file mode 100644 index 0000000..9c5f0f7 --- /dev/null +++ b/SrcUnix/EmDirRefUnix.h @@ -0,0 +1,19 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmDirRefWin_h +#define EmDirRefWin_h + +#include "EmDirRef.h" + +#endif /* EmDirRefWin_h */ diff --git a/SrcUnix/EmDlgFltk.cpp b/SrcUnix/EmDlgFltk.cpp new file mode 100644 index 0000000..c7e7dc1 --- /dev/null +++ b/SrcUnix/EmDlgFltk.cpp @@ -0,0 +1,2497 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmDlgFltk.h" + +#include "ErrorHandling.h" // ParamList +#include "Miscellaneous.h" // ReplaceString, FormatString +#include "Platform.h" // Platform::GetString +#include "Strings.r.h" // kStr_ + +#include <FL/Enumerations.H> +#include <FL/Fl.H> +#include <FL/Fl_Adjuster.H> +#include <FL/Fl_Bitmap.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Browser.H> +#include <FL/Fl_Browser_.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Chart.H> +#include <FL/Fl_Check_Button.H> +#include <FL/Fl_Choice.H> +#include <FL/Fl_Clock.H> +#include <FL/Fl_Color_Chooser.H> +#include <FL/Fl_Counter.H> +#include <FL/Fl_Dial.H> +#include <FL/Fl_Double_Window.H> +#include <FL/Fl_Fill_Dial.H> +#include <FL/Fl_Fill_Slider.H> +#include <FL/Fl_Float_Input.H> +#include <FL/Fl_FormsBitmap.H> +#include <FL/Fl_FormsPixmap.H> +#include <FL/Fl_Free.H> +#include <FL/Fl_Gl_Window.H> +#include <FL/Fl_Group.H> +#include <FL/Fl_Hold_Browser.H> +#include <FL/Fl_Hor_Fill_Slider.H> +#include <FL/Fl_Hor_Nice_Slider.H> +#include <FL/Fl_Hor_Slider.H> +#include <FL/Fl_Hor_Value_Slider.H> +#include <FL/Fl_Image.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Input_.H> +#include <FL/Fl_Int_Input.H> +#include <FL/Fl_Light_Button.H> +#include <FL/Fl_Line_Dial.H> +#include <FL/Fl_Menu.H> +#include <FL/Fl_Menu_.H> +#include <FL/Fl_Menu_Bar.H> +#include <FL/Fl_Menu_Button.H> +#include <FL/Fl_Menu_Item.H> +#include <FL/Fl_Menu_Window.H> +#include <FL/Fl_Multi_Browser.H> +#include <FL/Fl_Multi_Label.H> +#include <FL/Fl_Multiline_Input.H> +#include <FL/Fl_Multiline_Output.H> +#include <FL/Fl_Nice_Slider.H> +#include <FL/Fl_Object.H> +#include <FL/Fl_Output.H> +#include <FL/Fl_Overlay_Window.H> +#include <FL/Fl_Pack.H> +#include <FL/Fl_Pixmap.H> +#include <FL/Fl_Positioner.H> +#include <FL/Fl_Radio_Button.H> +#include <FL/Fl_Radio_Light_Button.H> +#include <FL/Fl_Radio_Round_Button.H> +#include <FL/Fl_Repeat_Button.H> +#include <FL/Fl_Return_Button.H> +#include <FL/Fl_Roller.H> +#include <FL/Fl_Round_Button.H> +#include <FL/Fl_Round_Clock.H> +#include <FL/Fl_Scroll.H> +#include <FL/Fl_Scrollbar.H> +#include <FL/Fl_Secret_Input.H> +#include <FL/Fl_Select_Browser.H> +#include <FL/Fl_Simple_Counter.H> +#include <FL/Fl_Single_Window.H> +#include <FL/Fl_Slider.H> +#include <FL/Fl_Tabs.H> +#include <FL/Fl_Tile.H> +#include <FL/Fl_Timer.H> +#include <FL/Fl_Toggle_Button.H> +#include <FL/Fl_Toggle_Light_Button.H> +#include <FL/Fl_Toggle_Round_Button.H> +#include <FL/Fl_Valuator.H> +#include <FL/Fl_Value_Input.H> +#include <FL/Fl_Value_Output.H> +#include <FL/Fl_Value_Slider.H> +#include <FL/Fl_Widget.H> +#include <FL/Fl_Window.H> +#include <FL/fl_ask.H> +#include <FL/fl_draw.H> +#include <FL/fl_file_chooser.H> +#include <FL/fl_message.H> +#include <FL/fl_show_colormap.H> +#include <FL/fl_show_input.H> + +#include "EmDlgFltkFactory.h" + +#include "espws-2.0/FileChooser.h" + +#include <algorithm> // find +#include <list> +#include <map> +#include <string> +#include <utility> // pair +#include <queue> + +#if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION == 0 +// FLTK 1.0.x had a different layout for the undocumented Fl_Label structure. +#define HAVE_LEGACY_FL_LABEL +#endif + +typedef string FilterList; + +static FilterList PrvConvertTypeList (const EmFileTypeList&); +static void PrvAddFilter (FilterList& filter, const char* pattern); +static Fl_Window* PrvMakeDialog (EmDlgID); +static Bool PrvInitializeDialog (EmDlgFn, void* data, EmDlgID, Fl_Window*); +static void PrvIdleCallback (void* data); +static string PrvBreakLine (Fl_Input_*, const char*); + + +// ----------------------------------------------------------------------------- +// helper routines for establishing z-order independent ids for widgets. + +typedef map<EmDlgItemID, Fl_Widget*> ID2WidgetType; +typedef map<Fl_Widget*, EmDlgItemID> Widget2IDType; + +ID2WidgetType gID2Widget; +Widget2IDType gWidget2ID; + +Fl_Widget* PrvFindWidgetByID (EmDlgItemID id) +{ + ID2WidgetType::iterator iter = gID2Widget.find (id); + if (iter == gID2Widget.end ()) + return NULL; + + return iter->second; +} + +EmDlgItemID PrvFindIDByWidget (Fl_Widget* o) +{ + Widget2IDType::iterator iter = gWidget2ID.find (o); + if (iter == gWidget2ID.end ()) + return kDlgItemNone; + + return iter->second; +} + +void PrvSetWidgetID (Fl_Widget* o, EmDlgItemID id) +{ + gID2Widget[id] = o; + gWidget2ID[o] = id; +} + +void PrvClearWidgetID (EmDlgItemID id) +{ + Fl_Widget* o = ::PrvFindWidgetByID (id); + + if (o != NULL) + { + gID2Widget.erase (id); + gWidget2ID.erase (o); + } +} + +void PrvClearWidgetID (Fl_Widget* o) +{ + EmDlgItemID id = ::PrvFindIDByWidget (o); + + if (id != kDlgItemNone) + { + gID2Widget.erase (id); + gWidget2ID.erase (o); + } +} + +void PrvClearAllWidgetIDs (void) +{ + gID2Widget.clear (); + gWidget2ID.clear (); +} + +void PrvClearDlgWidgetIDs (Fl_Group* w) +{ + // Clear self. + ::PrvClearWidgetID (w); + + // Clear children. + for (int ii = 0; ii < w->children (); ++ii) + { + Fl_Widget* child = w->child (ii); + + Fl_Group* g = dynamic_cast<Fl_Group*>(child); + if (g) + { + ::PrvClearDlgWidgetIDs (g); + } + else + { + ::PrvClearWidgetID (child); + } + } +} + +// Define data structures and routines for keeping track of +// strings that are associated with widgets. We need to keep +// track of what strings have been assigned to which widgets +// because FLTK widgets don't *own* the labels assigned to +// them. They expect the caller to own the storage. However, +// that's not the model EmDlg uses; it assumes that the widgets +// own the storage (as is the case in PowerPlant and with +// Windows). +// +// So when we set the label of a widget, we keep ownership +// of the string by storing it in a private collection. This +// collection is a "list" object. I chose that one so that +// strings currently in the collection are undisturbed when +// new strings are added. Widgets keep a pointer to the +// characters owned by the string object. If that object +// moves around as the result of adding new string objects, +// it might invalidate the pointer owned by the widget. + +typedef pair<Fl_Widget*, string> WidgetString; +typedef list<WidgetString> WidgetStringList; + +WidgetStringList gWidgetStrings; + +const char* PrvSetWidgetString (Fl_Widget* o, const string& s) +{ + // First see if there's already an entry for this widget. + + WidgetStringList::iterator iter = gWidgetStrings.end (); + while (iter != gWidgetStrings.end ()) + { + if (iter->first == o) + { + // Widget is already in the collection. + // Replace the string it owns. + + iter->second = s; + return iter->second.c_str (); + } + + ++iter; + } + + // Widget is not in the collection, so add an entry for it. + + gWidgetStrings.push_back (WidgetString (o, s)); + return (--(gWidgetStrings.end()))->second.c_str (); +} + +void PrvClearWidgetString (Fl_Widget* o) +{ + WidgetStringList::iterator iter = gWidgetStrings.end (); + while (iter != gWidgetStrings.end ()) + { + if (iter->first == o) + { + gWidgetStrings.erase (iter); + return; + } + + ++iter; + } +} + +void PrvClearAllWidgetStrings (void) +{ + gWidgetStrings.clear (); +} + +void PrvClearDlgWidgetStrings (Fl_Group* w) +{ + for (int ii = 0; ii < w->children (); ++ii) + { + Fl_Widget* child = w->child (ii); + ::PrvClearWidgetString (child); + + Fl_Group* g = dynamic_cast<Fl_Group*>(child); + if (g) + { + ::PrvClearDlgWidgetStrings (g); + } + } +} + +typedef pair<EmDlgContext*, EmDlgItemID> EmWidget; + +typedef vector<EmWidget> EmWidgetList; +EmWidgetList gWidgetList; + +typedef vector<Fl_Window*> Fl_Window_List; +Fl_Window_List gDialogList; + + +EmWidget PrvPopWidget (void) +{ + EmWidget result ((EmDlgContext*) NULL, kDlgItemNone); + + if (!gWidgetList.empty ()) + { + result = gWidgetList.front (); // Note, this is "top()" on Windows, maybe others... + gWidgetList.erase (gWidgetList.begin ()); + } + + return result; +} + + +void PrvPushWidget (EmDlgContext* context, EmDlgItemID itemID) +{ + EmWidget widget (context, itemID); + gWidgetList.push_back (widget); +} + + +void PrvClearQueue (EmDlgContext* context) +{ + if (!context) + { + gWidgetList.clear (); + } + else + { + EmWidgetList::iterator iter = gWidgetList.begin (); + + while (iter != gWidgetList.end ()) + { + if (context == iter->first) + { + EmWidgetList::size_type delta = iter - gWidgetList.begin (); + gWidgetList.erase (iter); + iter = gWidgetList.begin () + delta; + + continue; + } + + ++iter; + } + } +} + + +EmDlgItemID PrvFindCancelItem (Fl_Group* w) +{ + EmDlgItemID result = kDlgItemNone; + + for (int ii = 0; result == kDlgItemNone && ii < w->children (); ++ii) + { + Fl_Widget* child = w->child (ii); + + Fl_Group* g = dynamic_cast<Fl_Group*>(child); + Fl_Button* b = dynamic_cast<Fl_Button*>(child); + if (g) + { + result = ::PrvFindCancelItem (g); + } + else if (b) + { + if (b->shortcut () == FL_Escape) + { + result = ::PrvFindIDByWidget (b); + } + } + } + + return result; +} + + +void PrvWidgetCallback (Fl_Widget* w, void* c) +{ +// EmDlgItemID id = ::PrvFindIDByWidget (w); +// printf ("PrvWidgetCallback: id = 0x%08lX\n", (long) id); + + EmDlgContext* context = (EmDlgContext*) c; + EmAssert (context); + + EmDlgItemID itemID = ::PrvFindIDByWidget (w); + EmAssert (itemID != kDlgItemNone); + + ::PrvPushWidget (context, itemID); +} + + +void PrvWindowCallback (Fl_Widget* w, void* c) +{ + EmDlgContext* context = (EmDlgContext*) c; + EmAssert (context); + + Fl_Window* dlg = (Fl_Window*) context->fDlg; + EmAssert (dlg); + + // Look for the item with the Escape shortcut. + EmDlgItemID itemID = ::PrvFindCancelItem (dlg); + + // If one couldn't be found, for the kDlgItemCancel item + if (itemID == kDlgItemNone) + { + itemID = kDlgItemCancel; + } + + ::PrvPushWidget (context, itemID); +} + + +void PrvInstallCallback (Fl_Widget* o, void* data) +{ + // Install callbacks only for our widgets. We shouldn't + // mess up any other callbacks -- they may do something + // important (such as the callback installed into scrollbars + // in an Fl_Scroll pane). + + if (::PrvFindIDByWidget (o) != kDlgItemNone) + { + o->callback (&::PrvWidgetCallback, data); + } + + // Set the callback for the topmost window, too, so that we + // get notification when it's closed. + + else + { + Fl_Window* w = dynamic_cast<Fl_Window*> (o); + + if (w) + { + o->callback (&::PrvWindowCallback, data); + } + } +} + + +void PrvInstallCallbacks (Fl_Group* w, EmDlgContext* context) +{ + // Set self. + ::PrvInstallCallback (w, context); + + // Set children. + for (int ii = 0; ii < w->children (); ++ii) + { + Fl_Widget* child = w->child (ii); + + Fl_Group* g = dynamic_cast<Fl_Group*>(child); + if (g) + { + ::PrvInstallCallbacks (g, context); + } + else + { + ::PrvInstallCallback (child, context); + } + } +} + + +void PrvAddDialog (Fl_Window* dlg) +{ + gDialogList.push_back (dlg); +} + + +void PrvRemoveDialog (Fl_Window* dlg) +{ + Fl_Window_List::iterator iter = find (gDialogList.begin (), gDialogList.end (), dlg); + EmAssert (iter != gDialogList.end ()); + gDialogList.erase (iter); +} + + +void PrvDestroyDialog (EmDlgContext* context) +{ + EmAssert (context); + + Fl_Window* dlg = reinterpret_cast<Fl_Window*>(context->fDlg); + EmAssert (dlg); + + context->Destroy (); + EmDlg::HostStopIdling (*context); + + dlg->hide (); + + ::PrvRemoveDialog (dlg); + ::PrvClearDlgWidgetIDs (dlg); + ::PrvClearDlgWidgetStrings (dlg); + ::PrvClearQueue (context); + + delete dlg; + delete context; +} + + +// Process all events on our dialog widgets. If dlg is non-NULL, +// look for events that close that dialog. If the dialog is closed, +// return true and fill in dismissingItemID with the ID of the item +// that closed the dialog. + +Bool PrvHandleDialogEvents (Fl_Window* dlg, EmDlgItemID& dismissingItemID) +{ + // Loop, getting dialog items that have been manipulated in some way. + + EmWidget w = ::PrvPopWidget (); + + EmDlgContext* context = w.first; + EmDlgItemID itemID = w.second; + + while (context != NULL && itemID != kDlgItemNone) + { + // Handle the event on the dialog item, checking to see if the + // dialog should be closed. + + if (context->Event (itemID) == kDlgResultClose) + { + // The dialog is closing. + + Fl_Window* closingDlg = reinterpret_cast<Fl_Window*>(context->fDlg); + + // See if we're interested that this dialog closed. + + Bool interested = dlg && (closingDlg == dlg); + + // Destroy the dialog. + + ::PrvDestroyDialog (context); + + // If we're interested that this dialog closed, record the + // item that closed it and return TRUE. + + if (interested) + { + dismissingItemID = itemID; + + return true; + } + } + + w = ::PrvPopWidget (); + context = w.first; + itemID = w.second; + } + + return false; +} + + +void HandleDialogs (void) +{ + EmDlgItemID dummyItemID; + (void) ::PrvHandleDialogEvents (NULL, dummyItemID); +} + + +void HandleModalDialog (Fl_Window* dlg, EmDlgItemID& itemID) +{ + while (1) + { + // Handle any queued events. + + if (::PrvHandleDialogEvents (dlg, itemID)) + break; + + // Process any system events. + + Fl::wait (); + + // Check to see if an idle handler has asked to close the window. + + EmDlgContext* context = (EmDlgContext*) dlg->user_data (); + EmAssert (context); + + if (context->fFnResult == kDlgResultClose) + { + ::PrvDestroyDialog (context); + break; + } + } +} + + +void CloseAllDialogs (void) +{ + Fl_Window_List::iterator iter = gDialogList.begin (); + + while (iter != gDialogList.end ()) + { + EmDlgContext* context = (EmDlgContext*) (*iter)->user_data (); + EmAssert (context); + + ::PrvDestroyDialog (context); + ++iter; + } + + gDialogList.clear (); +} + + +// ----------------------------------------------------------------------------- +// callback used to close modal dialogs. modalResult is < 0 if not yet completed. +// set modalResult to be >=0 to complete dialog. Typically 0=cancel, 1=ok + +static long modalResult; +void modalCallback(Fl_Return_Button*, void* result) +{ + modalResult = (long) result; +} + + +// ----------------------------------------------------------------------------- +// modal dialog control loop + +static int postModalDialog (Fl_Window* dlg) +{ + modalResult = -9999; + dlg->show(); + + // run our own event loop so that we have total control + // of the UI thread + for (;;) + { + Fl::wait (); + if (modalResult != -9999) + break; + + if (!dlg->shown ()) + { + // user hit escape (cancel) + modalResult = 0; + break; + } + } + + // Clear out the default item queue. Stuff that we clicked on + // that didn't have a callback function will be in here. The + // items in that queue will be invalid after we close the window + // if we don't clear it out. + + while (Fl::readqueue ()) + ; + + dlg->hide (); + + return modalResult; +} + + +// ----------------------------------------------------------------------------- +// URL handler callback. This works whether netscape is currently running or +// not. +//!TODO: work with other browsers + +void openURL (Fl_Button* box, void*) +{ + char buffer[PATH_MAX]; + char url[PATH_MAX]; + + box->labelcolor (FL_RED); + + // get the label, trim the opening '<' and closing '>' + strcpy (url, &(box->label()[1])); + url [strlen (url) - 1] = '\0'; + +#ifdef __QNXNTO__ + sprintf (buffer, "voyager -u %s &", url); +#else + sprintf (buffer, "netscape -remote 'openURL(%s,new-window)' || netscape '%s' &", url, url); +#endif + + system (buffer); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::HostRunGetFile + * + * DESCRIPTION: Platform-specific routine for getting the name of a + * file from the user. This file name is used to load + * the file. + * + * PARAMETERS: typeList - types of files user is allowed to select. + * ref - selected file is returned here. Valid only if + * function result is kDlgItemOK. + * + * RETURNED: ID of dialog item that dismissed the dialog. + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunGetFile (const void* parameters) +{ + EmAssert (parameters); + DoGetFileParameters& data = *(DoGetFileParameters*) parameters; + + FilterList filter = ::PrvConvertTypeList (data.fFilterList); + + FileChooser chooser (data.fDefaultPath.IsSpecified () ? data.fDefaultPath.GetFullPath ().c_str () : NULL, + filter.c_str (), FileChooser::SINGLE, data.fPrompt.c_str ()); + + chooser.show (); + + while (chooser.shown ()) + Fl::wait (); + + long count = chooser.count (); + if (count == 0) + return kDlgItemCancel; + + // Get a EmFileRef to the given file + + data.fResult = EmFileRef (chooser.value(1)); + + return kDlgItemOK; +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::HostRunGetFileList + * + * DESCRIPTION: Platform-specific routine for getting the name of a + * file from the user. This file name is used to load + * the file. + * + * PARAMETERS: typeList - types of files user is allowed to select. + * ref - selected file is returned here. Valid only if + * function result is kDlgItemOK. + * + * RETURNED: ID of dialog item that dismissed the dialog. + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunGetFileList (const void* parameters) +{ + EmAssert (parameters); + DoGetFileListParameters& data = *(DoGetFileListParameters*) parameters; + + FilterList filter = ::PrvConvertTypeList (data.fFilterList); + + FileChooser chooser (data.fDefaultPath.IsSpecified () ? data.fDefaultPath.GetFullPath ().c_str () : NULL, + filter.c_str (), FileChooser::MULTI, data.fPrompt.c_str ()); + + chooser.show (); + + while (chooser.shown ()) + Fl::wait (); + + long count = chooser.count (); + if (count == 0) + return kDlgItemCancel; + + for (long ii = 1; ii <= count; ++ii) + { + data.fResults.push_back (EmFileRef (chooser.value (ii))); + } + + return kDlgItemOK; +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::HostRunPutFile + * + * DESCRIPTION: Platform-specific routine for getting the name of a + * file from the user. This file name is used to save + * the file. + * + * PARAMETERS: defName - default name for the file to be saved. + * ref - selected file is returned here. Valid only if + * function result is kDlgItemOK. + * + * RETURNED: ID of dialog item that dismissed the dialog. + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunPutFile (const void* parameters) +{ + EmAssert (parameters); + DoPutFileParameters& data = *(DoPutFileParameters*) parameters; + + FilterList filter = ::PrvConvertTypeList (data.fFilterList); + + FileChooser chooser (data.fDefaultPath.IsSpecified () ? data.fDefaultPath.GetFullPath ().c_str () : NULL, + filter.c_str (), FileChooser::CREATE, data.fPrompt.c_str ()); + + chooser.show (); + + while (chooser.shown ()) + Fl::wait (); + + long count = chooser.count (); + if (count == 0) + return kDlgItemCancel; + + // Get a EmFileRef to the given file + + data.fResult = EmFileRef (chooser.value (1)); + + return kDlgItemOK; +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::HostRunGetDirectory + * + * DESCRIPTION: Platform-specific routine for getting the name of a + * file from the user. This file name is used to load + * the file. + * + * PARAMETERS: typeList - types of files user is allowed to select. + * ref - selected file is returned here. Valid only if + * function result is kDlgItemOK. + * + * RETURNED: ID of dialog item that dismissed the dialog. + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunGetDirectory (const void* parameters) +{ + EmAssert (parameters); + DoGetDirectoryParameters& data = *(DoGetDirectoryParameters*) parameters; + + FileChooser chooser (data.fDefaultPath.IsSpecified () ? data.fDefaultPath.GetFullPath ().c_str () : NULL, + "nEveRmAtCh*", FileChooser::DIRECTORY, data.fPrompt.c_str ()); + + chooser.show (); + + while (chooser.shown ()) + Fl::wait (); + + long count = chooser.count (); + if (count == 0) + return kDlgItemCancel; + + // Get a EmFileRef to the given file + + data.fResult = EmDirRef (chooser.value (1)); + + return kDlgItemOK; +} + + +/*********************************************************************** + * + * FUNCTION: HostRunSessionSave + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunSessionSave (const void* parameters) +{ + EmAssert (parameters); + DoSessionSaveParameters& data = *(DoSessionSaveParameters*) parameters; + + string saveChanges (Platform::GetString (kStr_SaveBeforeClosing)); + + ParamList paramList; + paramList.push_back (string ("%AppName")); + paramList.push_back (data.fAppName); + paramList.push_back (string ("%DocName")); + paramList.push_back (data.fDocName); + + string msg = Errors::ReplaceParameters (saveChanges, paramList); + + int result = fl_choice (msg.c_str(), + Platform::GetString (kStr_Cancel).c_str(), + Platform::GetString (kStr_Yes).c_str(), + Platform::GetString (kStr_No).c_str() ); + + if (result == 1) // yes + return kDlgItemYes; + + else if (result == 2) // no + return kDlgItemNo; + + // result == 0 + return kDlgItemCancel; +} + + +/*********************************************************************** + * + * FUNCTION: HostRunAboutBox + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunAboutBox (const void* parameters) +{ + Fl_Window* aboutWin = ::PrvMakeDialog (kDlgAboutBox); + postModalDialog (aboutWin); + delete aboutWin; + + return kDlgItemOK; +} + + +/*********************************************************************** + * + * FUNCTION: HostRunDialog + * + * DESCRIPTION: Common routine that handles the creation of a dialog, + * initializes it (via the dialog handler), fetches events, + * handles events (via the dialog handler), and closes + * the dialog. + * + * PARAMETERS: fn - the custom dialog handler + * userData - custom data passed back to the dialog handler. + * dlgID - ID of dialog to create. + * + * RETURNED: ID of dialog item that dismissed the dialog. + * + ***********************************************************************/ + +EmDlgItemID EmDlg::HostRunDialog (const void* parameters) +{ + EmAssert (parameters); + RunDialogParameters& data = *(RunDialogParameters*) parameters; + + // Create the dialog. + Fl_Window* dlg = ::PrvMakeDialog (data.fDlgID); + if (!dlg) + return kDlgItemNone; + + // Initialize the dialog. + if (!::PrvInitializeDialog (data.fFn, data.fUserData, data.fDlgID, dlg)) + return kDlgItemNone; + + // Handle the dialog. + EmDlgItemID itemID; + + ::HandleModalDialog (dlg, itemID); + + // Return the item that dismissed the dialog. + return itemID; +} + + +/*********************************************************************** + * + * FUNCTION: HostDialogOpen + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: . + * + ***********************************************************************/ + +EmDlgRef EmDlg::HostDialogOpen (EmDlgFn fn, void* data, EmDlgID dlgID) +{ + // Create the dialog. + Fl_Window* dlg = ::PrvMakeDialog (dlgID); + if (!dlg) + return (EmDlgRef) NULL; + + // Initialize the dialog. + if (!::PrvInitializeDialog (fn, data, dlgID, dlg)) + return (EmDlgRef) NULL; + + // Return the dialog. + return (EmDlgRef) dlg; +} + + +/*********************************************************************** + * + * FUNCTION: HostDialogClose + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: . + * + ***********************************************************************/ + +void EmDlg::HostDialogClose (EmDlgRef dlg) +{ + Fl_Window* o = reinterpret_cast<Fl_Window*>(dlg); + if (!o) + return; + + EmDlgContext* context = (EmDlgContext*) o->user_data (); + EmAssert (context); + + ::PrvDestroyDialog (context); +} + + +/*********************************************************************** + * + * FUNCTION: HostStartIdling + * + * DESCRIPTION: Queue up our idle callback function with FLTK. + * + * PARAMETERS: context - context data to be provided to the callback + * function. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmDlg::HostStartIdling (EmDlgContext& context) +{ + Fl::add_timeout (.01, &::PrvIdleCallback, &context); +} + + +/*********************************************************************** + * + * FUNCTION: HostStopIdling + * + * DESCRIPTION: Remove our idle callback function from FLTK. + * + * PARAMETERS: context - context data to be provided to the callback + * function. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void EmDlg::HostStopIdling (EmDlgContext& context) +{ + Fl::remove_timeout (&::PrvIdleCallback, &context); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetDlgBounds + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetDlgBounds (EmDlgRef dlg, const EmRect& bounds) +{ + Fl_Window* o = reinterpret_cast<Fl_Window*>(dlg); + if (!o) + return; + + EmRect oldBounds = EmDlg::GetDlgBounds (dlg); + + if (oldBounds != bounds) + { + o->resize (bounds.fLeft, bounds.fTop, + bounds.Width (), bounds.Height ()); + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::CenterDlg + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::CenterDlg (EmDlgRef dlg) +{ + Fl_Window* o = reinterpret_cast<Fl_Window*>(dlg); + if (!o) + return; + + o->position ( + (Fl::w () - o->w ()) / 2, + (Fl::h () - o->h ()) / 3); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetDlgBounds + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmRect EmDlg::GetDlgBounds (EmDlgRef dlg) +{ + EmRect result (0, 0, 0, 0); + + Fl_Window* o = reinterpret_cast<Fl_Window*>(dlg); + if (!o) + return result; + + result.Set (o->x(), o->y(), o->x() + o->w(), o->y() + o->h()); + + return result; +} + + +void EmDlg::SetDlgDefaultButton (EmDlgContext& context, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Push_Button* b = dynamic_cast<Fl_Push_Button*>(o); + if (!b) + return; + + b->SetDefaultButton (); +} + + +void EmDlg::SetDlgCancelButton (EmDlgContext& context, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Push_Button* b = dynamic_cast<Fl_Push_Button*>(o); + if (!b) + return; + + b->SetCancelButton (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetItemMin + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetItemMin (EmDlgRef dlg, EmDlgItemID item, long minValue) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Valuator* valuator = dynamic_cast<Fl_Valuator*> (o); + if (valuator) + valuator->minimum (minValue); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetItemValue + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetItemValue (EmDlgRef dlg, EmDlgItemID item, long value) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + // ............................................................... + // Includes: Fl_Button, Fl_Light_Button, Fl_Check_Button, + // Fl_Radio_Light_Button, Fl_Round_Button, Fl_Radio_Round_Button, + // Fl_Repeat_Button, Fl_Radio_Buttion, Fl_Toggle_Button + // ............................................................... + + Fl_Button* button = dynamic_cast<Fl_Button*> (o); + if (button) + button->value (value); + + // ............................................................... + // Includes: Fl_Choice, Fl_Menu_Bar, Fl_Menu_Button + // ............................................................... + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + if (menu) + { + // Prevent out-of-range values. + + if (!menu->menu ()) + return; + + if (value > menu->size () - 1) + value = menu->size () - 1; + else if (value < 0) + value = 0; + + // Adjust for the fact that FLTK treats divider lines as + // an attribute of the preceding menu item, while our model + // is to treat them as seperate menu items. + + for (int ii = 0; ii < value; ++ii) + { + if (menu->menu ()[ii].flags & FL_MENU_DIVIDER) + { + --value; + } + } + + menu->value (value); + menu->redraw (); + } + + // ............................................................... + // Includes: Fl_Browser, Fl_Hold_Browser, Fl_Multi_Browser, + // Fl_Select_Browser (but not Fl_Browser_) + // ............................................................... + + Fl_Browser* browser = dynamic_cast<Fl_Browser*> (o); + if (browser) + browser->value (value); + + // ............................................................... + // Includes: Fl_Adjuster, Fl_Counter, Fl_Dial, Fl_Roller, + // Fl_Scrollber, Fl_Slider, Fl_Value_Input, Fl_Value_Slider, + // Fl_Value_Output + // ............................................................... + + Fl_Valuator* valuator = dynamic_cast<Fl_Valuator*> (o); + if (valuator) + valuator->value (value); + + // ............................................................... + // Includes: Fl_Input_, Fl_Input, Fl_Float_Input, Fl_Int_Input, + // Fl_Multiline_Input, Fl_Secret_Input, Fl_Output and + // Fl_Multiline_Output + // ............................................................... + + Fl_Input_* input = dynamic_cast<Fl_Input_*> (o); + if (input) + { + char buffer[20]; + sprintf (buffer, "%ld", (long) value); + EmDlg::SetItemText (dlg, item, buffer); + } + + // ............................................................... + // Includes: Fl_Box + // ............................................................... + + Fl_Box* box = dynamic_cast<Fl_Box*> (o); + if (box) + { + char buffer[20]; + ::FormatInteger (buffer, value); + EmDlg::SetItemText (dlg, item, buffer); + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetItemMax + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetItemMax (EmDlgRef dlg, EmDlgItemID item, long maxValue) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + // ............................................................... + // Includes: Fl_Adjuster, Fl_Counter, Fl_Dial, Fl_Roller, + // Fl_Scrollber, Fl_Slider, Fl_Value_Input, Fl_Value_Slider, + // Fl_Value_Output + // ............................................................... + + Fl_Valuator* valuator = dynamic_cast<Fl_Valuator*> (o); + if (valuator) + valuator->maximum (maxValue); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetItemBounds + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetItemBounds (EmDlgRef dlg, EmDlgItemID item, const EmRect& bounds) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + EmRect oldBounds = EmDlg::GetItemBounds (dlg, item); + + if (oldBounds != bounds) + { + o->resize (bounds.fLeft, bounds.fTop, + bounds.Width (), bounds.Height ()); + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SetItemText + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SetItemText (EmDlgRef dlg, EmDlgItemID item, string str) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Input_* in = dynamic_cast<Fl_Input_*> (o); + if (in) + { + // Can you believe it: Fl_Input_ doesn't do word wrap! + // So we have to do it ourself... + str = ::PrvBreakLine (in, str.c_str ()); + in->value (str.c_str ()); + } + else + { + // Setting the text of other items is tricky. That would be + // done by calling Fl_Widget::label. However, that function + // does not copy the text -- just the text pointer. That + // means the string object (or whatever is holding the storage) + // must exist after this function is called. + + // Additionally, it appears that we have to hide and then show + // the widget in order to get it to update properly. Merely + // calling redraw will not erase the old text in boxes like + // the file counter in the "Import Database" dialog. + + const char* s = ::PrvSetWidgetString (o, str); + + if (o->visible_r ()) + { + o->hide (); + o->label (s); + o->show (); + } + else + { + o->label (s); + } + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetItemValue + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +long EmDlg::GetItemValue (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return 0; + + // ............................................................... + // Includes: Fl_Button, Fl_Light_Button, Fl_Check_Button, + // Fl_Radio_Light_Button, Fl_Round_Button, Fl_Radio_Round_Button, + // Fl_Repeat_Button, Fl_Radio_Buttion, Fl_Toggle_Button + // ............................................................... + + Fl_Button* button = dynamic_cast<Fl_Button*> (o); + if (button) + return button->value (); + + // ............................................................... + // Includes: Fl_Choice, Fl_Menu_Bar, Fl_Menu_Button + // ............................................................... + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + if (menu) + { + if (menu->mvalue () == NULL) + return -1; + + long result = menu->value(); + long add = 0; + + // Adjust for the fact that FLTK treats divider lines as + // an attribute of the preceding menu item, while our model + // is to treat them as seperate menu items. + + for (int ii = 0; ii < result; ++ii) + { + if (menu->menu()[ii].flags & FL_MENU_DIVIDER) + { + add++; + } + } + + return result + add; + } + + // ............................................................... + // Includes: Fl_Browser (but not Fl_Browser_) + // ............................................................... + + Fl_Browser* browser = dynamic_cast<Fl_Browser*> (o); + if (browser) + return browser->value (); + + // ............................................................... + // Includes: Fl_Adjuster, Fl_Counter, Fl_Dial, Fl_Roller, + // Fl_Scrollber, Fl_Slider, Fl_Value_Input, Fl_Value_Slider, + // Fl_Value_Output + // ............................................................... + + Fl_Valuator* valuator = dynamic_cast<Fl_Valuator*> (o); + if (valuator) + return (long) valuator->value (); // !!! Really is a "double"! + + // ............................................................... + // Includes: Fl_Input_, Fl_Input, Fl_Float_Input, Fl_Int_Input, + // Fl_Multiline_Input, Fl_Secret_Input, Fl_Output and + // Fl_Multiline_Output + // ............................................................... + + Fl_Input_* input = dynamic_cast<Fl_Input_*> (o); + if (input) + { + const char* text = input->value (); + long value = 0; + sscanf (text, "%ld", &value); + return value; + } + + return 0; +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetItemBounds + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmRect EmDlg::GetItemBounds (EmDlgRef dlg, EmDlgItemID item) +{ + EmRect result (0, 0, 0, 0); + + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return result; + + result.Set (o->x(), o->y(), o->x() + o->w(), o->y() + o->h()); + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetItemText + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +string EmDlg::GetItemText (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return string (); + + Fl_Input_* in = dynamic_cast<Fl_Input_*> (o); + if (in) + return string (in->value ()); + + return string (o->label ()); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::EnableItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::EnableItem (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + o->activate (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::DisableItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::DisableItem (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + o->deactivate (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::ShowItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::ShowItem (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + o->show (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::HideItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::HideItem (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + o->hide (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::ClearMenu + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::ClearMenu (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + EmAssert (menu); + + menu->clear (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::AppendToMenu + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::AppendToMenu (EmDlgRef dlg, EmDlgItemID item, const StringList& strList) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + EmAssert (menu); + + StringList::const_iterator iter = strList.begin (); + while (iter != strList.end ()) + { + if (iter->empty ()) + { + menu->mode (menu->size () - 2, FL_MENU_DIVIDER); + } + else + { + menu->add (iter->c_str (), 0, NULL, NULL, 0); + } + + ++iter; + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::ClearList + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::ClearList (EmDlgRef dlg, EmDlgItemID item) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Browser* b = dynamic_cast<Fl_Browser*> (o); + EmAssert (b); + + b->clear (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::EnableMenuItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::EnableMenuItem (EmDlgRef dlg, EmDlgItemID item, long menuItem) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + EmAssert (menu); + EmAssert (menu->menu ()); + EmAssert (menuItem >= 0); + EmAssert (menuItem < menu->size ()); + + // Adjust for the fact that FLTK treats divider lines as + // an attribute of the preceding menu item, while our model + // is to treat them as seperate menu items. + + for (int ii = 0; ii < menuItem; ++ii) + { + if (menu->menu () [ii].flags & FL_MENU_DIVIDER) + { + --menuItem; + } + } + + /* DOLATER - kja: This won't work properly if we try to change a divider */ + menu->mode (menuItem, 0); + menu->redraw (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::DisableMenuItem + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::DisableMenuItem (EmDlgRef dlg, EmDlgItemID item, long menuItem) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Menu_* menu = dynamic_cast<Fl_Menu_*> (o); + EmAssert (menu); + EmAssert (menu->menu ()); + EmAssert (menuItem >= 0); + EmAssert (menuItem < menu->value ()); + + // Adjust for the fact that FLTK treats divider lines as + // an attribute of the preceding menu item, while our model + // is to treat them as seperate menu items. + + for (int ii = 0; ii < menuItem; ++ii) + { + if (menu->menu () [ii].flags & FL_MENU_DIVIDER) + { + --menuItem; + } + } + + /* DOLATER - kja: This won't work properly if we try to change a divider */ + menu->mode (menuItem, FL_MENU_INACTIVE); + menu->redraw (); +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::AppendToList + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::AppendToList (EmDlgRef dlg, EmDlgItemID item, const StringList& strList) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Browser* b = dynamic_cast<Fl_Browser*> (o); + EmAssert (b); + + StringList::const_iterator iter = strList.begin (); + while (iter != strList.end ()) + { + b->add (iter->c_str (), NULL); + ++iter; + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::SelectListItems + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::SelectListItems (EmDlgRef dlg, EmDlgItemID item, const EmDlgItemIndexList& itemList) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Browser* b = dynamic_cast<Fl_Browser*> (o); + EmAssert (b); + + EmDlgItemIndexList::const_iterator iter = itemList.begin (); + while (iter != itemList.end ()) + { + b->select (*iter + 1, 1); + ++iter; + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::UnselectListItems + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::UnselectListItems (EmDlgRef dlg, EmDlgItemID item, const EmDlgListIndexList& itemList) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Browser* b = dynamic_cast<Fl_Browser*> (o); + EmAssert (b); + + EmDlgItemIndexList::const_iterator iter = itemList.begin (); + while (iter != itemList.end ()) + { + b->select (*iter + 1, 0); + ++iter; + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetSelectedItems + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmDlg::GetSelectedItems (EmDlgRef dlg, EmDlgItemID item, EmDlgItemIndexList& itemList) +{ + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return; + + Fl_Browser* b = dynamic_cast<Fl_Browser*> (o); + EmAssert (b); + + for (int ii = 1; ii <= b->size (); ++ii) + { + if (b->selected (ii)) + { + itemList.push_back (ii - 1); + } + } +} + + +/*********************************************************************** + * + * FUNCTION: EmDlg::GetTextHeight + * + * DESCRIPTION: Determine the height the text would be if fitted into + * the given item. + * + * PARAMETERS: none + * + * RETURNED: New text height + * + ***********************************************************************/ + +int EmDlg::GetTextHeight (EmDlgRef dlg, EmDlgItemID item, const string& s) +{ + int result = 0; + + Fl_Widget* o = ::PrvFindWidgetByID (item); + if (!o) + return result; + + EmRect bounds = EmDlg::GetItemBounds (dlg, item); + int width = bounds.Width (); + + Fl_Input_* i = dynamic_cast<Fl_Input_*>(o); + + if (i) + { + // Note that Fl_Output::draw insets the width of the widget + // area when drawing. We need to account for that here if we want + // our text to be measured the same way it's laid out. + + Fl_Boxtype b = i->box () ? i->box () : FL_DOWN_BOX; + width -= Fl::box_dw (b) + 6; + + // FIXME: The Fl_Label structure is not documented, and its layout + // has changed in the past. These two measurements should be + // rewritten to use fl_measure or perhaps o->measure_label somehow. + + Fl_Label label = + { + s.c_str (), +#ifndef HAVE_LEGACY_FL_LABEL + NULL, + NULL, +#endif + FL_NORMAL_LABEL, + i->textfont (), + i->textsize (), + i->textcolor () + }; + + label.measure (width, result); + + result += Fl::box_dh (b); + } + else + { + // Note that Fl_Widget::draw_label insets the width of the widget + // area when drawing. We need to account for that here if we want + // our text to be measured the same way it's laid out. + + width -= Fl::box_dw (o->box ()); + + if ((o->w () > 11) && (o->align () & (FL_ALIGN_LEFT | FL_ALIGN_RIGHT))) + { + width -= 6; + } + + Fl_Label label = + { + s.c_str (), +#ifndef HAVE_LEGACY_FL_LABEL + NULL, + NULL, +#endif + o->labeltype (), + o->labelfont (), + o->labelsize (), + o->labelcolor () + }; + + label.measure (width, result); + } + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: PrvConvertTypeList + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +FilterList PrvConvertTypeList (const EmFileTypeList& typeList) +{ + FilterList filter; + + filter += "{"; + + EmFileTypeList::const_iterator iter = typeList.begin (); + + while (iter != typeList.end ()) + { + switch (*iter) + { + case kFileTypeNone: + break; + + case kFileTypeApplication: + break; + + case kFileTypeROM: + ::PrvAddFilter (filter, "*.[Rr][Oo][Mm]"); + break; + + case kFileTypeSession: + ::PrvAddFilter (filter, "*.[Pp][Ss][Ff]"); + break; + + case kFileTypeEvents: + ::PrvAddFilter (filter, "*.[Pp][Ee][Vv]"); + break; + + case kFileTypePreference: + break; + + case kFileTypePalmApp: + ::PrvAddFilter (filter, "*.[Pp][Rr][Cc]"); + break; + + case kFileTypePalmDB: + ::PrvAddFilter (filter, "*.[Pp][Dd][Bb]"); + break; + + case kFileTypePalmQA: + ::PrvAddFilter (filter, "*.[Pp][Qq][Aa]"); + break; + + case kFileTypeText: + ::PrvAddFilter (filter, "*.[Tt][Xx][Tt]"); + break; + + case kFileTypePicture: + ::PrvAddFilter (filter, "*.[Pp][Pp][Mm]"); + break; + + case kFileTypeSkin: + ::PrvAddFilter (filter, "*.[Ss][Kk][Ii][Nn]"); + break; + + case kFileTypeProfile: + break; + + case kFileTypePalmAll: + ::PrvAddFilter (filter, "*.[Pp][Rr][Cc]|*.[Pp][Dd][Bb]|*.[Pp][Qq][Aa]"); + break; + + case kFileTypeAll: + ::PrvAddFilter (filter, "*"); + break; + + case kFileTypeLast: + EmAssert (false); + break; + } + + ++iter; + } + + filter += "}"; + + return filter; +} + + +/*********************************************************************** + * + * FUNCTION: PrvAddFilter + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void PrvAddFilter (FilterList& filter, const char* pattern) +{ + if (filter.size() != 1) + { + filter += "|"; + } + + filter += pattern; +} + + +/*********************************************************************** + * + * FUNCTION: PrvMakeDialog + * + * DESCRIPTION: . + * + * PARAMETERS: None. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +Fl_Window* PrvMakeDialog (EmDlgID id) +{ + Fl_Window* w = NULL; + + switch (id) + { + case kDlgNone: + break; + + case kDlgAboutBox: + w = ::PrvMakeAboutDialog (); + break; + + case kDlgSessionNew: + w = ::PrvMakeSessionNewDialog (); + break; + + case kDlgSessionSave: + break; + + case kDlgHordeNew: + w = ::PrvMakeNewHordeDialog (); + break; + + case kDlgDatabaseImport: + w = ::PrvMakeDatabaseImportDialog (); + break; + + case kDlgDatabaseExport: + w = ::PrvMakeDatabaseExportDialog (); + break; + + case kDlgROMTransferQuery: + w = ::PrvMakeROMTransferQueryDialog (); + break; + + case kDlgROMTransferProgress: + w = ::PrvMakeROMTransferProgressDialog (); + break; + + case kDlgGremlinControl: + w = ::PrvMakeGremlinControlDialog (); + break; + + case kDlgEditPreferences: + w = ::PrvMakeEditPreferencesDialog (); + break; + + case kDlgEditLogging: + w = ::PrvMakeEditLoggingOptionsDialog (); + break; + + case kDlgEditDebugging: + w = ::PrvMakeEditDebuggingOptionsDialog (); + break; + + case kDlgEditSkins: + w = ::PrvMakeEditSkinsDialog (); + break; + + case kDlgEditHostFS: + w = ::PrvMakeHostFSOptionsDialog (); + break; + + case kDlgCommonDialog: + w = ::PrvMakeCommonDialog (); + break; + + case kDlgSaveBound: + break; + + case kDlgEditBreakpoints: + w = ::PrvMakeEditBreakpointsDialog (); + break; + + case kDlgEditCodeBreakpoint: + w = ::PrvMakeEditCodeBreakpointDialog (); + break; + + case kDlgEditTracingOptions: + w = ::PrvMakeEditTracingOptionsDialog (); + break; + + case kDlgEditPreferencesFullyBound: + break; + + case kDlgReset: + w = ::PrvMakeResetDialog (); + break; + + case kDlgSessionInfo: + w = ::PrvMakeSessionInfoDialog (); + break; + + case kDlgGetSocketAddress: +// w = ::PrvMakeGetSocketAddressDialog (); + break; + + case kDlgEditErrorHandling: + w = ::PrvMakeEditErrorHandlingDialog (); + break; + + case kDlgMinimizeProgress: + w = ::PrvMakeMinimizeDialog (); + break; + } + + return w; +} + + +Bool PrvInitializeDialog (EmDlgFn fn, void* data, EmDlgID dlgID, Fl_Window* dlg) +{ + EmDlgContext* context = new EmDlgContext; + if (!context) + { + delete dlg; + return false; + } + + context->fFn = fn; +// context->fFnResult = filled in after fFn is called; + context->fDlg = (EmDlgRef) dlg; + context->fDlgID = dlgID; +// context->fPanelID = filled in by subroutines; +// context->fItemID = filled in by subroutines; +// context->fCommandID = filled in by subroutines; +// context->fNeedsIdle = filled in by c'tor to false; + context->fUserData = data; + + // Center the dialog. + EmDlg::CenterDlg (context->fDlg); + + // Install callbacks for all the items we handle. + ::PrvInstallCallbacks (dlg, context); + + // Show the dialog. Note that the positioning of this call is + // important. The call to EmDlgContext::Init may result in the + // dialog's init handler trying to position the dialog. If it + // does that *before* the dialog is shown, some FLTK/X interaction + // causes the window to appear down and to the right by an amount + // equal to the top and left margins of the window frame. Showing + // the dialog first appears to fix that problem. + dlg->show(); + + // Initialize the dialog. Delete the dialog if + // initialization fails. + if (context->Init () == kDlgResultClose) + { + ::PrvDestroyDialog (context); + return false; + } + + // Add this dialog to our internal list. + ::PrvAddDialog (dlg); + + return true; +} + + +/*********************************************************************** + * + * FUNCTION: PrvIdleCallback + * + * DESCRIPTION: Function called by FLTK when our timeout function has + * timed out. Here we call the custom dialog handler. If + * it doesn't indicate that it's time to close the dialog, + * requeue the timeout function. + * + * PARAMETERS: data - callback data. We store the pointer to the + * current dialog context here. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void PrvIdleCallback (void* data) +{ + EmAssert (data); + EmDlgContext& context = *(EmDlgContext*) data; + + // Call the idle function. The result is stored in context.fFnResult + // as well as returned from the function. If we need to continue, + // then requeue the idle function. + + if (context.Idle () != kDlgResultClose && context.fNeedsIdle) + { + EmDlg::HostStartIdling (context); + } +} + + +// Copied from fl_draw.cxx, since they don't let us get to it directly. + +#define MAXBUF 1024 + +// Copy p to buf, replacing unprintable characters with ^X and \nnn +// Stop at a newline of if MAXBUF characters written to buffer. +// Also word-wrap if width exceeds maxw. +// Returns a pointer to the start of the next line of caharcters. +// Sets n to the number of characters put into the buffer. +// Sets width to the width of the string in the current font. + +static const char* +expand(const char* from, char* buf, double maxw, int& n, double &width, int wrap) { + + char* o = buf; + char* e = buf+(MAXBUF-4); +// underline_at = 0; + char* word_end = o; + const char* word_start = from; + double w = 0; + + const char* p = from; + for (;; p++) { + + int c = *p & 255; + + if (!c || c == ' ' || c == '\n') { + // test for word-wrap: + if (word_start < p && wrap) { + double newwidth = w + fl_width(word_end, o-word_end); + if (word_end > buf && newwidth > maxw) { // break before this word + o = word_end; + p = word_start; + break; + } + word_end = o; + w = newwidth; + } + if (!c) break; + else if (c == '\n') {p++; break;} + word_start = p+1; + } + + if (o > e) break; // don't overflow buffer + + if (c == '\t') { + for (c = (o-buf)%8; c<8 && o<e; c++) *o++ = ' '; + +#if 0 + } else if (c == '&' && fl_draw_shortcut && *(p+1)) { + if (*(p+1) == '&') {p++; *o++ = '&';} + else if (fl_draw_shortcut != 2) underline_at = o; +#endif + } else if (c < ' ' || c == 127) { // ^X + *o++ = '^'; + *o++ = c ^ 0x40; + + /* + * mike@easysw.com - The following escaping code causes problems when + * using the PostScript ISOLatin1 and WinANSI encodings, because these + * map to I18N characters... + */ +#if 0 + } else if (c >= 128 && c < 0xA0) { // \nnn + *o++ = '\\'; + *o++ = (c>>6)+'0'; + *o++ = ((c>>3)&7)+'0'; + *o++ = (c&7)+'0'; +#endif /* 0 */ + + } else if (c == 0xA0) { // non-breaking space + *o++ = ' '; + + } else { + *o++ = c; + + } + } + + width = w + fl_width(word_end, o-word_end); + *o = 0; + n = o-buf; + return p; +} + +string PrvBreakLine (Fl_Input_* in, const char* str) +{ + string result; + + // This function follows the outline of fl_measure. + + // Set the font so that we can measure the text's width. + + fl_font (in->textfont (), in->textsize ()); + + // Get the width of the box in which the text will be + // laid out. Fl_Output fudge by box_dw() + 6, so we + // must do that, too. + + int max_width = in->w (); + Fl_Boxtype b = in->box () ? in->box () : FL_DOWN_BOX; + + max_width -= Fl::box_dw (b) + 6; + + // Break up the string, adding it back together in + // "result", with the lines seperated by CR's. + + if (str) + { + const char* p; + const char* e; + char buf[MAXBUF]; + int buflen; + double width; + + for (p = str; *p; p = e) + { + e = expand (p, buf, max_width, buflen, width, true); + result += buf; + if (*e) + result += '\n'; + } + } + + return result; +} + +void Fl_Push_Button::draw (void) +{ + if (fType == kDefault) + { + Fl_Return_Button::draw (); + } + else + { + Fl_Button::draw (); + } +} + + +int Fl_Push_Button::handle (int event) +{ + if (fType == kDefault) + { + return Fl_Return_Button::handle (event); + } + + if (event == FL_SHORTCUT) + { + if (fType == kCancel && Fl::event_key () == FL_Escape) + { + do_callback (); + return 1; + } + } + + return Fl_Button::handle (event); +} diff --git a/SrcUnix/EmDlgFltk.h b/SrcUnix/EmDlgFltk.h new file mode 100644 index 0000000..25adce1 --- /dev/null +++ b/SrcUnix/EmDlgFltk.h @@ -0,0 +1,62 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmDlgFltk_h +#define EmDlgFltk_h + +#include "EmDlg.h" + +// For EmDlgFltkFactory.cpp +class Fl_Widget; +void PrvSetWidgetID (Fl_Widget* o, EmDlgItemID id); + +// For fltk_main.cpp +void HandleDialogs (void); +void CloseAllDialogs (void); + +// Fl_Push_Button is a button that can be configured as the Default +// Button (draws with the Return Arrow and responds to the Return +// key), Cancel Button (responds to the Escape Key), or a Normal +// Button (no special drawing or keyboard handling). + +#include <FL/Fl_Return_Button.H> + +class Fl_Push_Button : public Fl_Return_Button +{ + public: + Fl_Push_Button (int x, int y, int w, int h, const char* l = NULL) : + Fl_Return_Button (x, y, w, h, l), + fType (kNormal) + {} + + virtual int handle (int); + + void SetDefaultButton (void) { fType = kDefault; } + void SetCancelButton (void) { fType = kCancel; } + void SetNormalButton (void) { fType = kNormal; } + + protected: + virtual void draw (void); + + private: + enum + { + kNormal, + kDefault, + kCancel + }; + + int fType; +}; + +#endif /* EmDlgFltk_h */ diff --git a/SrcUnix/EmDlgFltkFactory.fl b/SrcUnix/EmDlgFltkFactory.fl new file mode 100644 index 0000000..db14c33 --- /dev/null +++ b/SrcUnix/EmDlgFltkFactory.fl @@ -0,0 +1,1157 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.00 +header_name {.h} +code_name {.cpp} +gridx 5 +gridy 5 +snap 3 +Function {PrvMakeROMTransferQueryDialog()} {} { + Fl_Window {} { + label {ROM Transfer} + xywh {752 584 520 400} labelsize 12 hide + code0 {\#include "EmCommon.h"} + code1 {\#include "EmDlgFltk.h"} + code2 {\#include "Platform.h"} modal + } { + Fl_Return_Button {} { + label Begin + xywh {330 355 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {420 355 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Scroll {} { + label {Instructions:} + xywh {20 30 480 290} type VERTICAL box DOWN_FRAME labelsize 12 align 5 + } { + Fl_Box {} { + xywh {22 32 476 550} labelsize 12 align 149 + code0 {::PrvSetWidgetID (o, kDlgItemDlqInstructions);} + } + } + Fl_Input {} { + label {Port:} + xywh {60 330 130 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDlqPortList);} + } + Fl_Choice {} { + label {Baud:} + xywh {60 360 130 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDlqBaudList);} + } {} + } +} + +Function {PrvMakeROMTransferProgressDialog()} {} { + Fl_Window {} { + label Progress + xywh {190 593 300 115} labelsize 12 hide + } { + Fl_Return_Button {} { + label Cancel + xywh {105 70 90 25} shortcut 0xff1b labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Box {} { + label {Waiting...} + xywh {20 15 280 20} box FLAT_BOX labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemDlpMessage);} + } + Fl_Slider {} { + xywh {20 40 260 15} type {Horz Fill} labeltype NO_LABEL labelsize 12 maximum 20 value 5 + code0 {::PrvSetWidgetID (o, kDlgItemDlpProgress);} + } + } +} + +Function {PrvMakeNewHordeDialog()} {} { + Fl_Window {} { + label {New Gremlin Horde} + xywh {86 192 410 460} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {220 415 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {310 415 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Button {} { + label {Logging Options...} + xywh {20 415 125 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdLogging);} + } + Fl_Group {} { + label {Gremlin range} + xywh {20 25 370 100} box THIN_DOWN_FRAME labelsize 12 align 5 + } { + Fl_Input {} { + label {From:} + xywh {60 35 55 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdStart);} + } + Fl_Input {} { + label {To:} + xywh {60 65 55 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdStop);} + } + Fl_Round_Button {} { + label {Switch after} + xywh {145 35 85 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdCheckSwitch);} + } + Fl_Round_Button {} { + label {Save after} + xywh {145 65 85 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdCheckSave);} + } + Fl_Round_Button {} { + label {Stop after} + xywh {145 95 85 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdCheckStop);} + } + Fl_Input {} { + label events + xywh {235 35 100 20} type Int labelsize 12 align 8 when 0 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdDepthSwitch);} + } + Fl_Input {} { + label events + xywh {235 65 100 20} type Int labelsize 12 align 8 when 0 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdDepthSave);} + } + Fl_Input {} { + label events + xywh {235 95 100 20} type Int labelsize 12 align 8 when 0 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdDepthStop);} + } + } + Fl_Group {} { + label Applications + xywh {20 150 370 250} box THIN_DOWN_FRAME labelsize 12 align 5 + } { + Fl_Browser {} { + label {Choose applications to launch:} + xywh {30 174 170 216} type Multi labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdAppList);} + } + Fl_Choice {} { + label {Choose which to launch first:} open + xywh {210 175 165 25} labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdFirstLaunchedApp);} + } {} + Fl_Button {} { + label {Select All} + xywh {210 225 90 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdSelectAll);} + } + Fl_Button {} { + label Deselect + xywh {210 260 90 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHrdSelectNone);} + } + } + } +} + +Function {PrvMakeEditSkinsDialog()} {} { + Fl_Window {} { + label Skins + xywh {897 266 300 280} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {110 235 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {200 235 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Browser {} { + label {Skins for current device:} + xywh {20 25 260 100} type Hold labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemSknSkinList);} + } + Fl_Group {} { + label {Other options} + xywh {20 150 260 70} box ENGRAVED_FRAME labelsize 12 align 5 + } { + Fl_Check_Button {} { + label {Double scale} + xywh {25 155 160 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemSknDoubleScale);} + } + Fl_Check_Button {} { + label {White background} + xywh {25 175 160 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemSknWhiteBackground);} + } + Fl_Check_Button {} { + label {Dim skin when inactive} + xywh {25 195 160 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemSknDim);} + } + } + } +} + +Function {PrvMakeEditLoggingOptionsDialog()} {} { + Fl_Window {} { + label {Logging Options} + xywh {53 135 405 275} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {215 230 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {305 230 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Group {} { + xywh {245 5 140 25} labelsize 12 + } { + Fl_Round_Button {} { + label Normal + xywh {245 5 65 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogNormal);} + } + Fl_Round_Button {} { + label Gremlins + xywh {310 5 75 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogGremlins);} + } + } + Fl_Box {} { + label {Log:} + xywh {20 25 365 185} box THIN_DOWN_BOX labelsize 12 align 5 + } + Fl_Check_Button {} { + label {Error messages} + xywh {25 30 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogErrorMessages);} + } + Fl_Check_Button {} { + label {Warning messages} + xywh {25 45 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogWarningMessages);} + } + Fl_Check_Button {} { + label {Misc Gremlin info} + xywh {25 60 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogGremlins);} + } + Fl_Check_Button {} { + label {Assembly opcodes} + xywh {25 75 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogCPUOpcodes);} + } + Fl_Check_Button {} { + label {Posted events} + xywh {210 30 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogEnqueuedEvents);} + } + Fl_Check_Button {} { + label {Received events} + xywh {210 45 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogDequeuedEvents);} + } + Fl_Check_Button {} { + label {System calls} + xywh {210 60 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogSystemCalls);} + } + Fl_Check_Button {} { + label {Application calls} + xywh {210 75 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogApplicationCalls);} + } + Fl_Check_Button {} { + label {Serial activity} + xywh {25 110 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogSerial);} + } + Fl_Check_Button {} { + label {Serial data} + xywh {210 110 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogSerialData);} + } + Fl_Check_Button {} { + label {NetLib activity} + xywh {25 125 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogNetLib);} + } + Fl_Check_Button {} { + label {NetLib data} + xywh {210 125 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogNetLibData);} + } + Fl_Check_Button {} { + label {ExgMgr activity} + xywh {25 140 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogExgMgr);} + } + Fl_Check_Button {} { + label {ExgMgr data} + xywh {210 140 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogExgMgrData);} + } + Fl_Check_Button {} { + label {RPC activity} + xywh {25 155 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogRPC);} + } + Fl_Check_Button {} { + label {RPC data} + xywh {210 155 145 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogRPCData);} + } + Fl_Check_Button {} { + label {High-level debugger activity} + xywh {25 170 185 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogHLDebugger);} + } + Fl_Check_Button {} { + label {High-level debugger data} + xywh {210 170 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogHLDebuggerData);} + } + Fl_Check_Button {} { + label {Low-level debugger activity} + xywh {25 185 185 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogLLDebugger);} + } + Fl_Check_Button {} { + label {Low-level debugger data} + xywh {210 185 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemLogLogLLDebuggerData);} + } + } +} + +Function {PrvMakeSessionNewDialog()} {} { + Fl_Window {} { + label {New Session} + xywh {942 412 280 170} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {90 125 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {180 125 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Choice {} { + label {ROM file:} + xywh {80 15 180 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemNewROM);} + } {} + Fl_Choice {} { + label {Device:} + xywh {80 40 180 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemNewDevice);} + } {} + Fl_Choice {} { + label {Skin:} + xywh {80 65 180 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemNewSkin);} + } {} + Fl_Choice {} { + label {RAM size:} + xywh {80 90 180 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemNewMemorySize);} + } {} + } +} + +Function {PrvMakeHostFSOptionsDialog()} {} { + Fl_Window {} { + label {HostFS Options} + xywh {850 280 330 220} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {140 175 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {230 175 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Browser {} { + label Slot + xywh {20 30 65 125} type Hold labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHfsList);} + } + Fl_Output {} { + label {Root path} + xywh {95 30 215 95} type Multiline labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHfsPath);} + } + Fl_Check_Button {} { + label Mounted + xywh {95 135 85 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHfsMounted);} + } + Fl_Button {} { + label Browse + xywh {230 135 80 20} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemHfsBrowse);} + } + } +} + +Function {PrvMakeDatabaseImportDialog()} {} { + Fl_Window {} { + label Install + xywh {674 242 290 90} labelsize 12 hide modal + } { + Fl_Box {} { + label {Items remaining to be installed:} + xywh {20 15 200 20} labelsize 12 align 20 + } + Fl_Box {} { + label 999 + xywh {225 15 45 20} labelsize 12 align 24 + code0 {::PrvSetWidgetID (o, kDlgItemImpNumFiles);} + } + Fl_Slider {} { + xywh {20 50 175 15} type {Horz Fill} labelsize 12 maximum 10 step 1 value 7 + code0 {::PrvSetWidgetID (o, kDlgItemImpProgress);} + } + Fl_Button {} { + label Stop + xywh {210 45 60 25} shortcut 0xff1b labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + } +} + +Function {PrvMakeCommonDialog()} {} { + Fl_Window {} { + label {Palm OS Emulator} + xywh {211 257 380 150} hide modal + } { + Fl_Button {} { + label Continue + xywh {280 105 80 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCmnButton1);} + class Fl_Push_Button + } + Fl_Button {} { + label Debug + xywh {190 105 80 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCmnButton2);} + class Fl_Push_Button + } + Fl_Button {} { + label {Reset...} + xywh {100 105 80 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCmnButton3);} + class Fl_Push_Button + } + Fl_Output {} { + xywh {20 15 340 75} type Multiline labelsize 12 align 0 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCmnText);} + code1 {Fl_Group::current ()->resizable (o);} + } + } +} + +Function {PrvMakeEditDebuggingOptionsDialog()} {} { + Fl_Window {} { + label {Debug Options} + xywh {76 97 415 357} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {225 315 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {315 315 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Box {} { + label Checks + xywh {20 30 375 200} box ENGRAVED_FRAME labelsize 12 align 5 + } + Fl_Check_Button {} { + label {Free chunk access} + xywh {30 40 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportFreeChunkAccess);} + } + Fl_Check_Button {} { + label {Hardware register access} + xywh {30 60 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportHardwareRegisterAccess);} + } + Fl_Check_Button {} { + label {Low memory access} + xywh {30 80 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportLowMemoryAccess);} + } + Fl_Check_Button {} { + label {Low stack access} + xywh {30 100 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportLowStackAccess);} + } + Fl_Check_Button {} { + label {MemMgr data access} + xywh {30 120 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportMemMgrDataAccess);} + } + Fl_Check_Button {} { + label {MemMgr leaks} + xywh {30 140 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportMemMgrLeaks);} + } + Fl_Check_Button {} { + label {MemMgr semaphore} + xywh {30 160 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportMemMgrSemaphore);} + } + Fl_Check_Button {} { + label {Offscreen form object} + xywh {30 180 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportOffscreenObject);} + } + Fl_Check_Button {} { + label {Overlay errors} + xywh {30 200 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportOverlayErrors);} + } + Fl_Check_Button {} { + label {Proscribed function call} + xywh {220 40 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportProscribedFunction);} + } + Fl_Check_Button {} { + label {ROM access} + xywh {220 60 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportROMAccess);} + } + Fl_Check_Button {} { + label {Screen access} + xywh {220 80 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportScreenAccess);} + } + Fl_Check_Button {} { + label {Sizeless form object} + xywh {220 100 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportSizelessObject);} + } + Fl_Check_Button {} { + label {Stack almost full} + xywh {220 120 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportStackAlmostOverflow);} + } + Fl_Check_Button {} { + label {Strict International checks} + xywh {220 140 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportStrictIntlChecks);} + } + Fl_Check_Button {} { + label {System global access} + xywh {220 160 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportSystemGlobalAccess);} + } + Fl_Check_Button {} { + label {UIMgr data access} + xywh {220 180 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportUIMgrDataAccess);} + } + Fl_Check_Button {} { + label {Unlocked chunk access} + xywh {220 200 170 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgReportUnlockedChunkAccess);} + } + Fl_Box {} { + label {Dialog handling} + xywh {20 255 375 40} box ENGRAVED_FRAME labelsize 12 align 5 + } + Fl_Check_Button {} { + label {Beep every 2 seconds when a dialog box is displayed} + xywh {30 265 335 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemDbgDialogBeep);} + } + } +} + +Function {PrvMakeEditBreakpointsDialog()} {} { + Fl_Window {} { + label Breakpoints + xywh {899 137 290 330} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {100 290 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {190 290 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Group {} { + label {Code breakpoints} + xywh {20 25 250 140} box ENGRAVED_BOX labelsize 12 align 5 + } { + Fl_Browser {} { + xywh {30 35 230 90} type Hold labelsize 12 align 0 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkList);} + } + Fl_Button {} { + label Edit + xywh {50 135 55 20} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkButtonEdit);} + } + Fl_Button {} { + label Clear + xywh {175 135 55 20} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkButtonClear);} + } + } + Fl_Group {} { + label {Data breakpoints} + xywh {20 190 250 90} box ENGRAVED_BOX labelsize 12 align 5 + } { + Fl_Check_Button {} { + label Enabled + xywh {30 200 80 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkCheckEnabled);} + } + Fl_Input {} { + label {Start address:} + xywh {130 225 130 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkStartAddress);} + } + Fl_Input {} { + label {Number of bytes:} + xywh {130 250 130 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkNumberOfBytes);} + } + } + } +} + +Function {PrvMakeEditCodeBreakpointDialog()} {} { + Fl_Window {} { + label {Code Breakpoint} + xywh {680 176 260 120} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {70 75 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {160 75 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Input {} { + label {Address:} + xywh {75 15 165 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkAddress);} + } + Fl_Input {} { + label {Condition:} + xywh {75 40 165 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemBrkCondition);} + } + } +} + +Function {PrvMakeDatabaseExportDialog()} {} { + Fl_Window {} { + label {Export Database} + xywh {643 135 260 385} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {70 340 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {160 340 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Browser {} { + label {Choose database to export:} + xywh {20 25 220 300} type Hold box DOWN_BOX labelsize 12 align 5 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemExpDbList);} + } + } +} + +Function {PrvMakeEditPreferencesDialog()} {} { + Fl_Window {} { + label Preferences + xywh {251 186 270 417} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {80 375 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {170 375 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Box {} { + label Communications + xywh {20 25 230 120} box THIN_DOWN_BOX labelsize 12 align 5 + } + Fl_Input {} { + label {Serial port:} + xywh {90 35 150 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfRedirectSerial);} + } + Fl_Input {} { + label {IR port:} + xywh {90 60 150 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfRedirectIR);} + } + Fl_Input {} { + label {Mystery:} + xywh {90 85 150 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfRedirectMystery);} + } + Fl_Check_Button {} { + label {Redirect NetLib calls to Host TCP/IP} + xywh {25 115 215 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfRedirectNetLib);} + } + Fl_Box {} { + label Sounds + xywh {20 180 230 30} box THIN_DOWN_BOX labelsize 12 align 5 + } + Fl_Check_Button {} { + label {Enable sound} + xywh {25 185 150 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfEnableSound);} + } + Fl_Box {} { + label {Closing / Quitting} + xywh {20 235 230 70} box THIN_DOWN_BOX labelsize 12 align 5 + } + Fl_Group {} { + xywh {25 240 150 60} + } { + Fl_Round_Button {} { + label {Always save session} + xywh {25 240 150 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfSaveAlways);} + } + Fl_Round_Button {} { + label {Ask to save session} + xywh {25 260 150 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfSaveAsk);} + } + Fl_Round_Button {} { + label {Never save session} + xywh {25 280 150 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfSaveNever);} + } + } + Fl_Box {} { + label {HotSync user name} + xywh {20 330 230 30} box THIN_DOWN_BOX labelsize 12 align 5 + } + Fl_Input {} { + xywh {25 335 220 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemPrfUserName);} + } + } +} + +Function {PrvMakeEditTracingOptionsDialog()} {} { + Fl_Window {} { + label {Tracing Options} + xywh {656 88 203 100} labelsize 12 hide modal + } {} +} + +Function {PrvMakeResetDialog()} {} { + Fl_Window {} { + label Reset + xywh {446 151 480 305} labelsize 12 hide + } { + Fl_Return_Button {} { + label Reset + xywh {290 260 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {380 260 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Group {} { + xywh {20 14 120 106} labelsize 12 + } { + Fl_Round_Button {} { + label {Soft reset} + xywh {20 15 105 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemRstSoft);} + } + Fl_Round_Button {} { + label {Hard reset} + xywh {20 55 105 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemRstHard);} + } + Fl_Round_Button {} { + label {Debug reset} + xywh {20 95 105 20} type Radio down_box ROUND_DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemRstDebug);} + } + } + Fl_Box {} { + xywh {20 157 440 3} box THIN_UP_BOX labelsize 12 + } + Fl_Check_Button {} { + label {No extensions} + xywh {20 175 105 20} down_box DOWN_BOX labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemRstNoExt);} + } + Fl_Box {} { + label {This is the same as inserting a pin in the reset hole on a device. It performs a standard reset.} + xywh {130 15 330 35} labelsize 12 align 149 + } + Fl_Box {} { + label {This is the same as a Soft Reset while holding down the Power key. It erases the storage heap.} + xywh {130 55 330 35} labelsize 12 align 149 + } + Fl_Box {} { + label {This is the same as a Soft Reset while holding down the Page Down key. It causes the ROM to execute a DbgBreak early in the boot sequence.} + xywh {130 95 330 50} labelsize 12 align 149 + } + Fl_Box {} { + label {This is the same as a Soft Reset while holding down the Page Up key. It skips the loading of extensions, patches, and certain libraries, as well as inhibiting the sending of sysAppLaunchCmdSystemReset to applications.} + xywh {130 175 330 65} labelsize 12 align 149 + } + } +} + +Function {PrvMakeSessionInfoDialog()} {} { + Fl_Window {} { + label {Session Info} + xywh {638 44 414 212} labelsize 12 hide + } { + Fl_Return_Button {} { + label OK + xywh {310 165 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Box {} { + label {Device name:} + xywh {25 25 105 30} labelsize 12 align 21 + } + Fl_Box {} { + label {RAM size} + xywh {25 55 105 30} labelsize 12 align 21 + } + Fl_Box {} { + label {ROM file path:} + xywh {25 85 105 30} labelsize 12 align 21 + } + Fl_Box {} { + label {Session file path:} + xywh {25 115 105 30} labelsize 12 align 21 + } + Fl_Box {} { + label {<Device Name>} + xywh {135 25 255 30} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemInfDeviceFld);} + } + Fl_Box {} { + label {<RAM Size>} + xywh {135 55 255 30} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemInfRAMFld);} + } + Fl_Box {} { + label {<ROM file>} + xywh {135 85 255 30} labelsize 12 align 213 + code0 {::PrvSetWidgetID (o, kDlgItemInfROMFld);} + } + Fl_Box {} { + label {<Session file>} + xywh {135 115 255 30} labelsize 12 align 213 + code0 {::PrvSetWidgetID (o, kDlgItemInfSessionFld);} + } + } +} + +Function {PrvMakeGremlinControlDialog()} {} { + Fl_Window {} { + label {Gremlin Control} + xywh {654 76 326 109} labelsize 12 hide + } { + Fl_Box {} { + label {Event: 0,000,000 of 0,000,000} + xywh {15 15 185 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemGrmEventNumber);} + } + Fl_Box {} { + label {Gremlin \#000} + xywh {215 15 95 20} labelsize 12 align 25 + code0 {::PrvSetWidgetID (o, kDlgItemGrmNumber);} + } + Fl_Box {} { + label {Elapsed time: 0,000,000.00 seconds} + xywh {15 40 225 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemGrmElapsedTime);} + } + Fl_Button {} { + label Stop + xywh {15 70 65 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemGrmStop);} + } + Fl_Button {} { + label Resume + xywh {135 70 65 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemGrmResume);} + } + Fl_Button {} { + label Step + xywh {245 70 65 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemGrmStep);} + } + } +} + +Function {PrvMakeEditErrorHandlingDialog()} {} { + Fl_Window {} { + label {Error Handling} + xywh {110 117 394 318} labelsize 12 hide modal + } { + Fl_Return_Button {} { + label OK + xywh {190 270 80 25} labelsize 12 hotspot + code0 {::PrvSetWidgetID (o, kDlgItemOK);} + } + Fl_Button {} { + label Cancel + xywh {290 270 80 25} shortcut 0xff1b labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + Fl_Box {} { + label {If Gremlins is off:} + xywh {20 30 350 90} box ENGRAVED_FRAME labelsize 12 align 5 + } + Fl_Choice {} { + label {On warnings:} + xywh {115 45 225 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemErrWarningOff);} + } {} + Fl_Choice {} { + label {On errors:} + xywh {115 80 225 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemErrErrorOff);} + } {} + Fl_Box {} { + label {If Gremlins is on:} + xywh {20 160 350 90} box ENGRAVED_FRAME labelsize 12 align 5 + } + Fl_Choice {} { + label {On warnings:} + xywh {115 175 225 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemErrWarningOn);} + } {} + Fl_Choice {} { + label {On errors:} + xywh {115 210 225 20} labelsize 12 textsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemErrErrorOn);} + } {} + } +} + +Function {PrvMakeAboutDialog()} {} { + Fl_Window {} { + label {About Palm OS(R) Emulator} + xywh {124 348 362 231} hide + code0 {\#include <FL/Fl_Pixmap.H>} + code1 {\#include "poser.xpm"} modal + } { + Fl_Return_Button {} { + label OK + user_data 1 + callback modalCallback + xywh {280 197 75 25} labelsize 12 + } + Fl_Box {} { + xywh {10 15 50 60} + code0 {Fl_Pixmap* p = new Fl_Pixmap (poser_xpm);} + code1 {p->label (o);} + } + Fl_Tabs {} { + xywh {70 10 285 180} + } { + Fl_Group {} { + label Palm + xywh {95 35 260 155} labelsize 12 hide + code0 {o->show ();} + } { + Fl_Box {} { + label Version + xywh {100 45 240 20} labelfont 1 labelsize 12 align 21 + code0 {static string versionStr;} + code1 {versionStr = string ("Palm OS Emulator Version ") + Platform::GetShortVersionString();} + code2 {o->label (versionStr.c_str ());} + } + Fl_Box {} { + label {Copyright (c) 1998-2001 Palm, Inc.} + xywh {100 70 240 15} labelsize 10 align 21 + } + Fl_Button {} { + label {<http://www.palmos.com>} + callback openURL + xywh {100 105 125 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + Fl_Button {} { + label {<mailto:bug.reports@corp.palm.com>} + callback openURL + xywh {100 120 175 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + Fl_Box {} { + label {Download the latest version from:} + xywh {100 140 165 15} labelsize 10 align 21 + } + Fl_Button {} { + label {<http://www.palmos.com/dev/tech/tools/emulator>} + callback openURL + xywh {100 155 235 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + } + Fl_Group {} { + label Windows + xywh {95 35 260 155} labelsize 12 hide + } { + Fl_Box {} { + label {Original Windows Copilot by Greg Hewgill} + xywh {100 55 240 15} labelsize 10 align 21 + } + Fl_Box {} { + label {Portions copyright (c) 1996-1997} + xywh {100 70 240 15} labelsize 10 align 21 + } + Fl_Button {} { + label {<http://www.hewgill.com>} + callback openURL + xywh {100 100 125 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + Fl_Button {} { + label {<mailto:greg@hewgill.com>} + callback openURL + xywh {100 115 130 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + } + Fl_Group {} { + label Macintosh + xywh {95 35 260 155} labelsize 12 hide + } { + Fl_Box {} { + label {Original Mac port by Craig Schofield} + xywh {100 55 240 15} labelsize 10 align 21 + } + Fl_Box {} { + label {Portions copyright (c) 1995-1997} + xywh {100 70 240 15} labelsize 10 align 21 + } + Fl_Button {} { + label {<http://members.aol.com/illumesoft/illume.html>} + callback openURL + xywh {100 100 220 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + Fl_Button {} { + label {<mailto:ILLUMESoft@aol.com>} + callback openURL + xywh {100 115 150 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + } + Fl_Group {} { + label UAE + xywh {95 35 260 155} labelsize 12 + } { + Fl_Box {} { + label {UAE Amiga Emulator by Bernd Schmidt} + xywh {100 55 240 15} labelsize 10 align 21 + } + Fl_Box {} { + label {Portions copyright (c) 1995-1997} + xywh {100 70 240 15} labelsize 10 align 21 + } + Fl_Button {} { + label {<http://www.freiburg.linux.de/~uae>} + callback openURL + xywh {100 100 170 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + Fl_Button {} { + label {<mailto:crux@pool.informatik.rwth-aachen.de>} + callback openURL selected + xywh {100 115 225 15} box FLAT_BOX selection_color 2 labelsize 10 labelcolor 4 align 21 + } + } + } + } +} + +Function {PrvMakeMinimizeDialog()} {} { + Fl_Window {} { + label {Minimizing...} + xywh {644 124 375 125} labelsize 12 hide + } { + Fl_Box {} { + label {Pass \#000} + xywh {265 15 95 20} labelsize 12 align 25 + code0 {::PrvSetWidgetID (o, kDlgItemMinPassNumber);} + } + Fl_Box {} { + label {Event: 0,000,000 of 0,000,000} + xywh {15 15 250 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemMinEventNumber);} + } + Fl_Box {} { + label {Elapsed time: 0,000,000.00 seconds} + xywh {15 35 250 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemMinElapsed);} + } + Fl_Box {} { + label {Excluding range 0,000,000 to 0,000,000} + xywh {15 55 250 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemMinRange);} + } + Fl_Box {} { + label {Discarded 0,000,000 of 0,000,000 events} + xywh {15 75 250 20} labelsize 12 align 21 + code0 {::PrvSetWidgetID (o, kDlgItemMinDiscarded);} + } + Fl_Slider {} { + xywh {15 95 260 15} type {Horz Fill} labeltype NO_LABEL labelsize 12 maximum 20 value 5 + code0 {::PrvSetWidgetID (o, kDlgItemMinProgress);} + } + Fl_Button {} { + label Cancel + xywh {295 90 65 25} labelsize 12 + code0 {::PrvSetWidgetID (o, kDlgItemCancel);} + } + } +} diff --git a/SrcUnix/EmDocumentUnix.cpp b/SrcUnix/EmDocumentUnix.cpp new file mode 100644 index 0000000..1af30d7 --- /dev/null +++ b/SrcUnix/EmDocumentUnix.cpp @@ -0,0 +1,142 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmDocumentUnix.h" + +#include "EmScreen.h" // EmScreen + +// !!! Need to get rid of this dependancy on FLTK +#include <FL/filename.h> // filename_setext + +#include <stdio.h> // fopen, fprintf, fwrite, fclose, FILE + + +EmDocumentUnix* gHostDocument; + +// --------------------------------------------------------------------------- +// ¥ EmDocument::HostCreateDocument +// --------------------------------------------------------------------------- +// Create our document instance. This is the one and only function that +// creates the document. Being in a platform-specific file, it can create +// any subclass of EmDocument it likes (in particular, one specific to our +// platform). + +EmDocument* EmDocument::HostCreateDocument (void) +{ + return new EmDocumentUnix; +} + + +#pragma mark - + +/*********************************************************************** + * + * FUNCTION: EmDocumentUnix::EmDocumentUnix + * + * DESCRIPTION: Constructor. Sets the global host application variable + * to point to us. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmDocumentUnix::EmDocumentUnix (void) : + EmDocument () +{ + EmAssert (gHostDocument == NULL); + gHostDocument = this; +} + + +/*********************************************************************** + * + * FUNCTION: EmDocumentUnix::~EmDocumentUnix + * + * DESCRIPTION: Destructor. Closes our window and sets the host + * application variable to NULL. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmDocumentUnix::~EmDocumentUnix (void) +{ + EmAssert (gHostDocument == this); + gHostDocument = NULL; +} + + +#pragma mark - + +// --------------------------------------------------------------------------- +// ¥ EmDocumentUnix::HostSaveScreen +// --------------------------------------------------------------------------- +// Save the current contents of the LCD buffer to the given file. + +void EmDocumentUnix::HostSaveScreen (const EmFileRef& destRef) +{ + // Make sure the extension is right. + + string fullPath = destRef.GetFullPath (); + char* fNameExt = (char*) malloc (fullPath.size () + 4); + strcpy (fNameExt, fullPath.c_str ()); + filename_setext (fNameExt, ".ppm"); + + FILE* f = fopen (fNameExt, "wb"); + if (f) + { + EmScreen::InvalidateAll (); + + EmScreenUpdateInfo info; + EmScreen::GetBits (info); + + EmScreen::InvalidateAll (); + + info.fImage.ConvertToFormat (kPixMapFormat24RGB); + + // PPM format is: + // + // File type tag + // Width + // Height + // Max component value + // Width * Height pixels + // + // The first items in the file are all text and + // seperated by whitespace. The array of pixels + // is in text format if the file type is P3, and + // is in binary format if the type is P6. + + EmPoint size = info.fImage.GetSize (); + + fprintf (f, "P6 %ld %ld 255\x0D", size.fX, size.fY); + + uint8* bits = (uint8*) info.fImage.GetBits (); + for (long yy = 0; yy < size.fY; ++yy) + { + long rowBytes = info.fImage.GetRowBytes (); + uint8* basePtr = bits + yy * rowBytes; + + fwrite (basePtr, 1, rowBytes, f); + } + + fclose (f); + } + + free (fNameExt); +} diff --git a/SrcUnix/EmDocumentUnix.h b/SrcUnix/EmDocumentUnix.h new file mode 100644 index 0000000..ee5a08f --- /dev/null +++ b/SrcUnix/EmDocumentUnix.h @@ -0,0 +1,40 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1998-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmDocumentUnix_h +#define EmDocumentUnix_h + +#include "EmDocument.h" + +/* + EmDocumentUnix is a Unix-specific sub-class of EmDocument. It is + responsible for translating platform-specific document-related + actions into cross-platform actions, making use of the the cross- + platform EmDocument implementations. +*/ + +class EmDocumentUnix : public EmDocument +{ + public: + EmDocumentUnix (void); + virtual ~EmDocumentUnix (void); + + public: + // I'd like these to be private, but at least one part of Poser + // needs access to HostSaveScreen. + virtual void HostSaveScreen (const EmFileRef&); +}; + +extern EmDocumentUnix* gHostDocument; + +#endif // EmDocumentUnix_h diff --git a/SrcUnix/EmFileRefUnix.cpp b/SrcUnix/EmFileRefUnix.cpp new file mode 100644 index 0000000..df94e0c --- /dev/null +++ b/SrcUnix/EmFileRefUnix.cpp @@ -0,0 +1,547 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmFileRefUnix.h" + +#include "Miscellaneous.h" // EndsWith +#include "Platform.h" // stricmp + +#include <errno.h> // ENOENT +#include <sys/stat.h> +#include <unistd.h> + + +static const char* kExtension[] = +{ + NULL, // kFileTypeNone, + NULL, // kFileTypeApplication + ".rom", // kFileTypeROM, + ".psf", // kFileTypeSession, + ".pev", // kFileTypeEvents, + ".ini", // kFileTypePreference, + ".prc", // kFileTypePalmApp, + ".pdb", // kFileTypePalmDB, + ".pqa", // kFileTypePalmQA, + ".txt", // kFileTypeText, + NULL, // kFileTypePicture, + ".skin", // kFileTypeSkin, + ".prof", // kFileTypeProfile, + NULL, // kFileTypePalmAll, + NULL // kFileTypeAll +}; + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::EmFileRef + * + * DESCRIPTION: Various ways to make a file reference. + * + * PARAMETERS: none. + * + * RETURNED: nothing. + * + ***********************************************************************/ + +EmFileRef::EmFileRef (void) : + fFilePath () +{ + COMPILE_TIME_ASSERT(countof (kExtension) == kFileTypeLast); +} + + +EmFileRef::EmFileRef (const EmFileRef& other) : + fFilePath (other.fFilePath) +{ +} + + +EmFileRef::EmFileRef (const char* path) : + fFilePath (path) +{ + this->MaybePrependCurrentDirectory (); + this->MaybeNormalize (); +} + + +EmFileRef::EmFileRef (const string& path) : + fFilePath (path) +{ + this->MaybePrependCurrentDirectory (); + this->MaybeNormalize (); +} + + +EmFileRef::EmFileRef (const EmDirRef& parent, const char* path) : + fFilePath (parent.GetFullPath () + path) +{ + this->MaybeNormalize (); +} + + +EmFileRef::EmFileRef (const EmDirRef& parent, const string& path) : + fFilePath (parent.GetFullPath () + path) +{ + this->MaybeNormalize (); +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::EmFileRef + * + * DESCRIPTION: EmFileRef destructor. Nothing special to do... + * + * PARAMETERS: none. + * + * RETURNED: nothing. + * + ***********************************************************************/ + +EmFileRef::~EmFileRef (void) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::operator= + * + * DESCRIPTION: Assignment operator. If "other" is not the same as + * the controlled object, copy the contents. + * + * PARAMETERS: other - object to copy. + * + * RETURNED: reference to self. + * + ***********************************************************************/ + +EmFileRef& +EmFileRef::operator= (const EmFileRef& other) +{ + if (&other != this) + { + fFilePath = other.fFilePath; + } + + return *this; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::IsSpecified + * + * DESCRIPTION: Returns whether or not the controlled object has been + * pointed to a (possibly non-existant) file, or if it's + * empty (that it, it was created with the default ctor). + * + * PARAMETERS: none. + * + * RETURNED: True if the object points to a file. + * + ***********************************************************************/ + +Bool +EmFileRef::IsSpecified (void) const +{ + return !fFilePath.empty (); +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::Exists + * + * DESCRIPTION: Returns whether or not the controlled object points to + * an existing file. + * + * PARAMETERS: none. + * + * RETURNED: True if the referenced file exists. + * + ***********************************************************************/ + +Bool +EmFileRef::Exists (void) const +{ + if (this->IsSpecified ()) + { + struct stat buf; + int result = stat (fFilePath.c_str (), &buf); + + return result == 0; + } + + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::IsType + * + * DESCRIPTION: DESCRIPTION + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +Bool +EmFileRef::IsType (EmFileType type) const +{ + if (fFilePath.size () > 4 && + kExtension[type] != NULL && + ::EndsWith (fFilePath.c_str (), kExtension[type])) + { + return true; + } + + // Add special hacks for ROM files. + if (type == kFileTypeROM && ::StartsWith (fFilePath.c_str(), "rom.")) + { + return true; + } + + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::SetCreatorAndType + * + * DESCRIPTION: Set the Finder type and creator information of the + * managed file. + * + * PARAMETERS: none. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void +EmFileRef::SetCreatorAndType (EmFileCreator creator, EmFileType fileType) const +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::GetAttr + * + * DESCRIPTION: Get basic file attributes of the managed file. + * + * PARAMETERS: A pointer to an integer where the mode bits will be stored. + * + * RETURNED: An integer containing an errno style error result, 0 for no error. + * + ***********************************************************************/ + +int +EmFileRef::GetAttr (int * mode) const +{ + EmAssert(mode); + + *mode = 0; + + if (!IsSpecified()) + return ENOENT; + + struct stat stat_buf; + if (stat(GetFullPath().c_str(), &stat_buf)) + return errno; + + if ((stat_buf.st_mode & S_IWUSR) == 0) + *mode |= kFileAttrReadOnly; + + return 0; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::SetAttr + * + * DESCRIPTION: Set basic file attributes of the managed file. + * + * PARAMETERS: An integer containing bits from the EmFileAttr enum. + * + * RETURNED: An integer containing an errno style error result, 0 for no error. + * + ***********************************************************************/ + +int +EmFileRef::SetAttr (int mode) const +{ + if (!IsSpecified()) + return ENOENT; + + struct stat stat_buf; + if (stat(GetFullPath().c_str(), &stat_buf)) + return errno; + + stat_buf.st_mode &= ~S_IWUSR; + if (!(mode & kFileAttrReadOnly)) + stat_buf.st_mode |= S_IWUSR; + + if (chmod(GetFullPath().c_str(), stat_buf.st_mode)) + return errno; + + return 0; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::GetName + * + * DESCRIPTION: Returns the name of the referenced file. Only the file + * *name* is returned, not the full path. + * + * PARAMETERS: none. + * + * RETURNED: A string containing the name. If the file is not + * specified, an empty string is returned. No checks are + * made to see if the file actually exists. + * + ***********************************************************************/ + +string +EmFileRef::GetName (void) const +{ + string result; + + if (this->IsSpecified ()) + { + string::size_type pos = fFilePath.rfind ('/', string::npos); + EmAssert (pos != string::npos); + + result = fFilePath.substr (pos + 1, string::npos); + } + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::GetParent + * + * DESCRIPTION: Returns an object representing the parent (or container) + * of the managed file. + * + * PARAMETERS: none. + * + * RETURNED: An object representing the file's parent. + * + ***********************************************************************/ + +EmDirRef +EmFileRef::GetParent (void) const +{ + EmDirRef result; + + if (this->IsSpecified () && fFilePath != "/") + { + string::size_type pos = fFilePath.rfind ('/', string::npos); + EmAssert (pos != string::npos); + + result = EmDirRef (fFilePath.substr (0, pos + 1)); + } + + return result; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::GetFullPath + * + * DESCRIPTION: Get a full (platform-specific) path to the object. + * + * PARAMETERS: none. + * + * RETURNED: An string representing the file's path. + * + ***********************************************************************/ + +string +EmFileRef::GetFullPath (void) const +{ + return fFilePath; +} + + +/*********************************************************************** + * + * FUNCTION: EmFileRef::operator== + * FUNCTION: EmFileRef::operator!= + * FUNCTION: EmFileRef::operator> + * FUNCTION: EmFileRef::operator< + * + * DESCRIPTION: Bogus operators for wiggy VC++ compiler which won't let + * us instantiate STL containers without them. + * + * PARAMETERS: other - object to compare ourself to. + * + * RETURNED: True if the requested condition is true. Comparisons + * are based on the file's full path. + * + ***********************************************************************/ + +bool +EmFileRef::operator== (const EmFileRef& other) const +{ + return _stricmp (fFilePath.c_str (), other.fFilePath.c_str ()) == 0; +} + + +bool +EmFileRef::operator!= (const EmFileRef& other) const +{ + return _stricmp (fFilePath.c_str (), other.fFilePath.c_str ()) != 0; +} + + +bool +EmFileRef::operator> (const EmFileRef& other) const +{ + return _stricmp (fFilePath.c_str (), other.fFilePath.c_str ()) < 0; +} + + +bool +EmFileRef::operator< (const EmFileRef& other) const +{ + return _stricmp (fFilePath.c_str (), other.fFilePath.c_str ()) > 0; +} + + +/*********************************************************************** + * + * FUNCTION: FromPrefString + * + * DESCRIPTION: Initialize this object from the string containing a file + * reference stored in a preference file. + * + * PARAMETERS: s - the string from the preference file + * + * RETURNED: True if we were able to carry out the initialization. + * False otherwise. Note that the string is NOT validated + * to see if it refers to an existing file. + * + ***********************************************************************/ + +bool +EmFileRef::FromPrefString (const string& s) +{ + fFilePath = s; + + return true; +} + + +/*********************************************************************** + * + * FUNCTION: ToPrefString + * + * DESCRIPTION: Produce a string that can be stored to a preference file + * and which can later be used to reproduce the current + * file reference object. + * + * PARAMETERS: None + * + * RETURNED: The string to be written to the preference file. + * + ***********************************************************************/ + +string +EmFileRef::ToPrefString (void) const +{ + return fFilePath; +} + + +/*********************************************************************** + * + * FUNCTION: MaybePrependCurrentDirectory + * + * DESCRIPTION: Prepend the current working directory if the managed + * path is not a full path. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void +EmFileRef::MaybePrependCurrentDirectory (void) +{ + if (fFilePath[0] != '/') + { + size_t bufSize = 256; + char* buffer = (char*) Platform::AllocateMemory (bufSize); + while (getcwd (buffer, bufSize) == NULL) + { + if (errno != ERANGE) + return; + + bufSize *= 2; + buffer = (char*) Platform::ReallocMemory (buffer, bufSize); + } + + size_t cwdLen = strlen (buffer); + if (cwdLen) + { + if (buffer[cwdLen - 1] != '/') + fFilePath = string (buffer) + "/" + fFilePath; + else + fFilePath = string (buffer) + fFilePath; + } + + Platform::DisposeMemory (buffer); + } +} + + +/*********************************************************************** + * + * FUNCTION: MaybeNormalize + * + * DESCRIPTION: The routines we use to fetch a file from the user + * sometimes return full paths starting with double + * slashes. While the file system allows that, it play + * havoc with our operator=(). Patch up full paths + * so that they don't start with '//' + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void +EmFileRef::MaybeNormalize (void) +{ + if (fFilePath.size () >= 2 && + fFilePath[0] == '/' && + fFilePath[1] == '/') + { + fFilePath.erase (fFilePath.begin ()); + } +} diff --git a/SrcUnix/EmFileRefUnix.h b/SrcUnix/EmFileRefUnix.h new file mode 100644 index 0000000..9cca412 --- /dev/null +++ b/SrcUnix/EmFileRefUnix.h @@ -0,0 +1,19 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmFileRefWin_h +#define EmFileRefWin_h + +#include "EmFileRef.h" + +#endif /* EmFileRefWin_h */ diff --git a/SrcUnix/EmMenusFltk.cpp b/SrcUnix/EmMenusFltk.cpp new file mode 100644 index 0000000..e42440e --- /dev/null +++ b/SrcUnix/EmMenusFltk.cpp @@ -0,0 +1,94 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmMenusFltk.h" + +#include <ctype.h> // isalpha + + +static int PrvMakeShortcut (int ch) +{ + if (ch == 0) + return 0; + + if (isalpha (ch)) + ch = tolower (ch); + + return FL_ALT + ch; +} + + +void HostCreatePopupMenu (const EmMenuItemList& menu, Fl_Menu_Item_List& menuList) +{ + EmMenuItemList::const_iterator iter = menu.begin (); + while (iter != menu.end ()) + { + if (iter->GetIsDivider ()) + { + // Do nothing here. Dividers are not their own menu item + // in FLTK. Rather, they are an attribute of the previous + // menu item. The setting of this attribute is taken care + // of below when the menu item is created. + } + else + { + const EmMenuItemList& children = iter->GetChildren (); + Fl_Menu_Item fltkItem; + + fltkItem.text = iter->GetTitle ().c_str (); + fltkItem.shortcut_ = ::PrvMakeShortcut (iter->GetShortcut ()); + fltkItem.callback_ = NULL; + fltkItem.user_data_ = (void*) iter->GetCommand (); + fltkItem.flags = 0; + fltkItem.labeltype_ = 0; + fltkItem.labelfont_ = 0; + fltkItem.labelsize_ = FL_NORMAL_SIZE; + fltkItem.labelcolor_ = 0; + + if (!iter->GetIsActive ()) + { + fltkItem.flags |= FL_MENU_INACTIVE; + } + + if (iter->GetIsChecked ()) + { + fltkItem.flags |= FL_MENU_TOGGLE; + } + + if (children.size () > 0) + { + fltkItem.flags |= FL_SUBMENU; + } + + if (((iter + 1) < menu.end ()) && (iter + 1)->GetIsDivider ()) + { + fltkItem.flags |= FL_MENU_DIVIDER; + } + + menuList.push_back (fltkItem); + + if (children.size () > 0) + { + ::HostCreatePopupMenu (children, menuList); + } + } + + ++iter; + } + + // Add a terminating item. + + Fl_Menu_Item fltkItem = {0}; + menuList.push_back (fltkItem); +} diff --git a/SrcUnix/EmMenusFltk.h b/SrcUnix/EmMenusFltk.h new file mode 100644 index 0000000..c37d1ca --- /dev/null +++ b/SrcUnix/EmMenusFltk.h @@ -0,0 +1,25 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmMenusFLTK_h +#define EmMenusFLTK_h + +#include "EmMenus.h" // EmCommandID + +#include <FL/Fl_Menu_Item.h> + +typedef vector<Fl_Menu_Item> Fl_Menu_Item_List; + +void HostCreatePopupMenu (const EmMenuItemList&, Fl_Menu_Item_List&); + +#endif // EmMenusFLTK_h diff --git a/SrcUnix/EmPixMapUnix.cpp b/SrcUnix/EmPixMapUnix.cpp new file mode 100644 index 0000000..7ae7f6b --- /dev/null +++ b/SrcUnix/EmPixMapUnix.cpp @@ -0,0 +1,48 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmPixMapUnix.h" + + + +// --------------------------------------------------------------------------- +// ¥ ConvertPixMapToHost +// --------------------------------------------------------------------------- + +void ConvertPixMapToHost ( const EmPixMap& src, void* dest, + int firstLine, int lastLine, Bool scale) +{ + // Determine a lot of the values we'll need. + + int factor = scale ? 2 : 1; + EmPoint factorPoint = EmPoint (factor, factor); + + EmPoint srcSize = src.GetSize (); + EmPixMapRowBytes destRowBytes = srcSize.fX * 3 * factor; + + // Finally, copy the bits, converting to 24 bit format along the way. + + EmPixMap wrapper; + + wrapper.SetSize (srcSize * factorPoint); + wrapper.SetFormat (kPixMapFormat24RGB); + wrapper.SetRowBytes (destRowBytes); + wrapper.SetColorTable (src.GetColorTable ()); + wrapper.SetBits (dest); + + EmRect srcBounds (0, firstLine, srcSize.fX, lastLine); + EmRect destBounds (srcBounds * factorPoint); + + EmPixMap::CopyRect (wrapper, src, destBounds, srcBounds); +} diff --git a/SrcUnix/EmPixMapUnix.h b/SrcUnix/EmPixMapUnix.h new file mode 100644 index 0000000..dcfca9e --- /dev/null +++ b/SrcUnix/EmPixMapUnix.h @@ -0,0 +1,22 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmPixMapUnix_h +#define EmPixMapUnix_h + +#include "EmPixMap.h" // EmPixMap + +void ConvertPixMapToHost ( const EmPixMap& src, void* buffer, + int firstLine, int lastLine, Bool scale); + +#endif // EmPixMapUnix_h diff --git a/SrcUnix/EmTransportSerialUnix.cpp b/SrcUnix/EmTransportSerialUnix.cpp new file mode 100644 index 0000000..4ecaf4a --- /dev/null +++ b/SrcUnix/EmTransportSerialUnix.cpp @@ -0,0 +1,1211 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmTransportSerialUnix.h" + +#include "Logging.h" // LogSerial +#include "Platform.h" // Platform::AllocateMemory + +#include <errno.h> // errno +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> // open(), close() +#include <termios.h> // struct termios + + +#define PRINTF if (!LogSerial ()) ; else LogAppendMsg + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostConstruct + * + * DESCRIPTION: Construct platform-specific objects/data. + * + * PARAMETERS: None + * + * RETURNED: The platform-specific serial object. + * + ***********************************************************************/ + +void EmTransportSerial::HostConstruct (void) +{ + fHost = new EmHostTransportSerial; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostDestruct + * + * DESCRIPTION: Destroy platform-specific objects/data. + * + * PARAMETERS: hostData - The platform-specific serial object. + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostDestruct (void) +{ + delete fHost; + fHost = NULL; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostOpen + * + * DESCRIPTION: Open the serial port in a platform-specific fashion. + * + * PARAMETERS: None + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportSerial::HostOpen (void) +{ + ErrCode err = fHost->OpenCommPort (fConfig); + + if (!err) + err = fHost->CreateCommThreads (fConfig); + + if (err) + this->HostClose (); + + return err; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostClose + * + * DESCRIPTION: Close the serial port in a platform-specific fashion. + * + * PARAMETERS: None + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportSerial::HostClose (void) +{ + ErrCode err; + + err = fHost->DestroyCommThreads (); + err = fHost->CloseCommPort (); + + return err; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostRead + * + * DESCRIPTION: Read bytes from the port in a platform-specific fashion. + * + * PARAMETERS: len - maximum number of bytes to read. + * data - buffer to receive the bytes. + * + * RETURNED: 0 if no error. The number of bytes actually read is + * returned in len if there was no error. + * + ***********************************************************************/ + +ErrCode EmTransportSerial::HostRead (long& len, void* data) +{ + fHost->GetIncomingData (data, len); + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostWrite + * + * DESCRIPTION: Write bytes to the port in a platform-specific fashion. + * + * PARAMETERS: len - number of bytes in the buffer. + * data - buffer containing the bytes. + * + * RETURNED: 0 if no error. The number of bytes actually written is + * returned in len if there was no error. + * + ***********************************************************************/ + +ErrCode EmTransportSerial::HostWrite (long& len, const void* data) +{ + fHost->PutOutgoingData (data, len); + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostBytesInBuffer + * + * DESCRIPTION: Returns the number of bytes that can be read with the + * Read method. Note that bytes may be received in + * between the time BytesInBuffer is called and the time + * Read is called, so calling the latter with the result + * of the former is not guaranteed to fetch all received + * and buffered bytes. + * + * PARAMETERS: None + * + * RETURNED: Number of bytes that can be read. + * + ***********************************************************************/ + +long EmTransportSerial::HostBytesInBuffer (long /*minBytes*/) +{ + return fHost->IncomingDataSize (); +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostSetConfig + * + * DESCRIPTION: Configure the serial port in a platform-specific + * fashion. The port is assumed to be open. + * + * PARAMETERS: config - configuration information. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportSerial::HostSetConfig (const ConfigSerial& config) +{ + PRINTF ("EmTransportSerial::HostSetConfig: Setting settings."); + + ErrCode err = errNone; + + struct termios io; + + // Get the current settings. + + if (tcgetattr (fHost->fCommHandle, &io) == -1) // macro for ioctl (..., TCGETA, ...) call + { + err = errno; + return err; + } + + // One article on the net ("Serial Programming Guide for POSIX Compliant + // Operating Systems", <http://www.easysw.com/~mike/serial/serial.html>) + // recommends to *always* set these. + + io.c_cflag |= (CREAD | CLOCAL); + + // An execllent article on serial programming under UNIX ("Linux Serial Port + // Programming Mini-Howto") says to turn off these for "raw" (as opposed to + // "canonical") mode. + + io.c_lflag &= ~(ICANON | ECHO | ISIG); + + // The UNIX Programming FAQ (<www://www.faqs.org/faqs/unix-faq/programmer/faq/>) + // recommends just setting all the c_iflags and c_oflags to zero. + + io.c_iflag = io.c_oflag = 0; + + // Set the baud + + int hostBaud = fHost->GetBaud (config.fBaud); + cfsetospeed (&io, hostBaud); + cfsetispeed (&io, hostBaud); + + // Set the parity + + if (config.fParity == EmTransportSerial::kNoParity) + { + io.c_cflag &= ~PARENB; + } + else + { + io.c_cflag |= PARENB; + + if (config.fParity == EmTransportSerial::kOddParity) + { + io.c_cflag |= PARODD; + } + else + { + io.c_cflag &= ~PARODD; + } + } + + // Set the data bits + + io.c_cflag &= ~CSIZE; + io.c_cflag |= fHost->GetDataBits (config.fDataBits); + + // Set the stop bits + + if (config.fStopBits == 2) + { + io.c_cflag |= CSTOPB; + } + else + { + io.c_cflag &= ~CSTOPB; + } + + + // Set the hardware handshaking + // + // Note that I used to have the stuff in the #if 0. + // However, on the Windows side, Olivier Naudan argues: + // + // But I don't agree with: dcb.fRtsControl = config.fHwrHandshake ? + // RTS_CONTROL_HANDSHAKE : RTS_CONTROL_ENABLE; + // As hardware overrun can't be emulated, because of Poser timing that + // can't be accurate, I believe that fRtsControl should always be set to + // RTS_CONTROL_HANDSHAKE. So bytes will always arrive succesfully to host, + // and only software overrun could happen if PalmOS does not control the + // emulated RTS. + + /* + Additional commentary + + From Alexandre Duret-Lutz <aduret@enst.fr>: + + I have a Unix application which connect to a serial device, and + configure the serial line with the following parameter. + + ... + int fd = open ("/dev/ttyS0", O_RDWR); + ... + tty.c_cflag = CS8 | B9600 | CLOCAL | CREAD; // No CRTSCTS. + ... + tcsetattr (fd, TCSANOW, &tty); + ... + + I also have the same application adapted to the Palm, which + connect to the same device, and initialize the line with + + ... + UInt32 serFlags = srmSettingsFlagStopBits1 | srmSettingsFlagBitsPerChar8; + UInt16 serFlagsLen = sizeof serFlags; + ... + SrmOpen (serPortCradlePort, 9600, &port); + ... + SrmControl (port, srmCtlSetFlags, &serFlags, &serFlagsLen); + .... + + Both applications work fine. But while the latter work on the + Palm it doesn't work in Pose. (The data seems to be sent but the + serial device never answer and my appl eventually timeout on + SrmReceive.) + + Since 3.0a8, Pose is turning CRTSCTS on for all serial + connections, I beleive this is killing me. Indeed if I change + this behavior back to how it was in 3.0a7 my appl runs all fine. + + --- SrcUnix/EmTransportSerialUnix.cpp.old Wed Apr 11 14:29:45 2001 + +++ SrcUnix/EmTransportSerialUnix.cpp Wed Apr 11 14:30:00 2001 + @@ -283,7 +283,7 @@ + // and only software overrun could happen if PalmOS does not control the + // emulated RTS. + + -#if 0 + +#if 1 + if (config.fHwrHandshake) + { + io.c_cflag |= CRTSCTS; + + + I guess this might be related to Dave Sours' recent postings, + as his appl broke when he switched from 3.0a7 and 3.1. + -- + Alexandre Duret-Lutz + + To which Olivier replies: + + Keith, + + Apparently, the change in Unix UART emulation is not exactly equivallent + to the Windows one. The change I proposed activates RTS handshaking + only, not CTS handshaking, whereas the change in Unix version activate + both (io.c_cflag |= CRTSCTS) + + If opposite device does not handle flow control, or if the serial cable + is not completely wired, the CTS handshaking MUST be deactivated. + Otherwise, the host (Windows or Unix) will never send bytes to the other + device, because CTS will always be deasserted. + + On the other hand, RTS handshaking can be activated safely on the host. + This signal is taken into account by the other device, or simply ignored + if it does not handle RTS handshaking. + + So on the Unix version, the flag must also be set to RTS-only, if + possible. Otherwise, just revert the change. + + One point is not clear to me. The developper says: + + "The data seems to be sent but the serial device never answer and my + appl eventually timeout on SrmReceive." + + In fact, since the other device does not handle flow control, the data + must not be sent due to CTS deasserted. As a result, the SrmReceive + never get an answer. + + To check this, you may ask this developper to use a hardware serial spy + (a box with blinking LEDs indicating signal states) and check if the TD + (Transmit Data) led blink. It shouldn't. If it does, my guess is wrong. + Another option is to use a software serial spy. On Windows NT, I use + "PortMon". It shows low-level calls to NT serial driver. + + BTW I proposed to always activate RTS handshaking on the host because in + the past some other tasks running may slow Poser up to the point of an + overrun. With this change, it does not occur any more if the other + device handle flow control, and I think it is safe. + I can't imagine a device that does not handle flow control, but that + still rely on a particular state of CTS/RTS. + + Moreover, software overrun can still occur in the emulated UART if + PalmOS does not deassert RTS. Hardware overrun can't be emulated because + of intermediate buffering on the host and hazardous timing. + + To help developpers understand the change, I propose the following text: + + "dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; + + Whatever state of emulated UART is, we always activate RTS flow control + on the host. This would prevent host buffer overrun, in case the host is + busy and in case the opposite device handle RTS handshaking. This is + safe because if the opposite device does not handle flow control, it + will just ignore that signal. + + However, we activate CTS handshaking only if IGNORE_CTS register is not + set. If the opposite device does not handle CTS and if we rely on CTS + state, data will never be sent." + + To conclude, try using CTS-only flag on Unix version. If the CTS-only + flag does not exist, just revert the change. Also check the Macintosh + version. Ask the developper to investigate to check if data are really + sent or not. They shouldn't. + + Hope this helps :-) + + All of that is the long-winded explanation of why CRTSCTS is deasserted + when hardware handshaking is off. + */ + +#if 1 + if (config.fHwrHandshake) + { + io.c_cflag |= CRTSCTS; + } + else + { + io.c_cflag &= ~CRTSCTS; + } +#else + io.c_cflag |= CRTSCTS; +#endif + + // Write out the changed settings. + if (tcsetattr (fHost->fCommHandle, TCSANOW, &io) == -1) // macro for ioctl (TCSETS, &io); + { + err = errno; + return err; + } + + return err; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostSetRTS + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostSetRTS (RTSControl /*state*/) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostSetDTR + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostSetDTR (Bool /*state*/) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostSetBreak + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostSetBreak (Bool /*state*/) +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostGetCTS + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: Nothing + * + ***********************************************************************/ + +Bool EmTransportSerial::HostGetCTS (void) +{ + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostGetDSR + * + * DESCRIPTION: . + * + * PARAMETERS: . + * + * RETURNED: Nothing + * + ***********************************************************************/ + +Bool EmTransportSerial::HostGetDSR (void) +{ + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostGetPortNameList + * + * DESCRIPTION: Return the list of serial ports on this computer. Used + * to prepare a menu of serial port choices. + * + * PARAMETERS: nameList - port names are added to this list. + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostGetPortNameList (PortNameList& results) +{ + results.clear (); + +#ifdef __QNXNTO__ + results.push_back ("/dev/ser1"); + results.push_back ("/dev/ser2"); +#else + results.push_back ("/dev/ttyS0"); + results.push_back ("/dev/ttyS1"); + results.push_back ("/dev/ttyS2"); + results.push_back ("/dev/ttyS3"); +#endif +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportSerial::HostGetSerialBaudList + * + * DESCRIPTION: Return the list of baud rates support by this computer. + * Used to prepare a menu of baud rate choices. + * + * PARAMETERS: baudList - baud rates are added to this list. + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportSerial::HostGetSerialBaudList (BaudList& results) +{ + long maxBaud = 115200; // ::PrvGetMaxBaudRate ()? How to + // determine that on Unix?. + + switch (maxBaud) + { + case 115200: results.push_back (115200); + case 57600: results.push_back (57600); + case 38400: results.push_back (38400); + case 19200: results.push_back (19200); + case 9600: results.push_back (9600); + } +} + + +#pragma mark - + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial c'tor + * + * DESCRIPTION: Constructor. Initialize our data members. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmHostTransportSerial::EmHostTransportSerial (void) : + fReadThread (NULL), + fWriteThread (NULL), + fCommHandle (0), + fCommSignalPipeA (0), + fCommSignalPipeB (0), + fTimeToQuit (false), + fDataMutex (), + fDataCondition (&fDataMutex), + fReadMutex (), + fReadBuffer (), + fWriteMutex (), + fWriteBuffer () +{ +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial d'tor + * + * DESCRIPTION: Destructor. Delete our data members. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmHostTransportSerial::~EmHostTransportSerial (void) +{ + EmAssert (fReadThread == NULL); + EmAssert (fWriteThread == NULL); + EmAssert (fCommHandle == 0); + EmAssert (fCommSignalPipeA == 0); + EmAssert (fCommSignalPipeB == 0); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::OpenCommPort + * + * DESCRIPTION: Open the serial port. + * + * PARAMETERS: config - data block describing which port to use. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmHostTransportSerial::OpenCommPort (const EmTransportSerial::ConfigSerial& config) +{ + EmTransportSerial::PortName portName = config.fPort; + + PRINTF ("EmTransportSerial::HostOpen: attempting to open port \"%s\"", + portName.c_str()); + + if (!portName.empty ()) + { + PRINTF ("EmTransportSerial::HostOpen: Opening serial port..."); + + // An execllent article on serial programming under UNIX ("Linux Serial Port + // Programming Mini-Howto") says to set the following flags in the open call. + // The O_NDELAY is so that you can open the serial port without having DCD + // asserted. I'm not sure what the O_NOCTTY is for. + + fCommHandle = open(portName.c_str (), O_RDWR | O_NOCTTY | O_NDELAY); + + if (fCommHandle <= 0) + { + fCommHandle = 0; + + return errno; + } + } + else + { + PRINTF ("EmTransportSerial::HostOpen: No port selected in the Properties dialog box..."); + return -1; // !!! better error number + } + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::CreateCommThreads + * + * DESCRIPTION: Create the threads that asynchronously read from and + * write to the serial port. + * + * PARAMETERS: config - data block describing which port to use. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmHostTransportSerial::CreateCommThreads (const EmTransportSerial::ConfigSerial& /*config*/) +{ + if (fCommHandle) + { + PRINTF ("EmTransportSerial::HostOpen: Creating serial port handler threads..."); + + // Create the pipe used to communicate with CommRead. + + int filedes[] = { 0, 0 }; + if (pipe (filedes) == 0) + { + fCommSignalPipeA = filedes[0]; // for reading + fCommSignalPipeB = filedes[1]; // for writing + } + + // Create the threads and start them up. + + fTimeToQuit = false; + fReadThread = omni_thread::create (CommRead, this); + fWriteThread = omni_thread::create (CommWrite, this); + } + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::DestroyCommThreads + * + * DESCRIPTION: Shutdown and destroy the comm threads. + * + * PARAMETERS: None. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmHostTransportSerial::DestroyCommThreads (void) +{ + // If never created, nothing to destroy. + + if (!fCommSignalPipeA) + return errNone; + + // Signal the threads to quit. + + fDataMutex.lock (); + + fTimeToQuit = true; + + int dummy = 0; + write (fCommSignalPipeB, &dummy, sizeof (dummy)); // Signals CommRead. + + fDataCondition.broadcast (); // Signals CommWrite. + fDataMutex.unlock (); + + // Wait for the threads to quit. + + if (fReadThread) + { + fReadThread->join (NULL); + fWriteThread->join (NULL); + } + + // Thread objects delete themselves, so set our references to NULL. + + fReadThread = NULL; + fWriteThread = NULL; + + // Close the signal pipe. + + close (fCommSignalPipeA); + close (fCommSignalPipeB); + + fCommSignalPipeA = fCommSignalPipeB = 0; + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::CloseCommPort + * + * DESCRIPTION: Close the comm port. + * + * PARAMETERS: None. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmHostTransportSerial::CloseCommPort (void) +{ + (void) close (fCommHandle); + + fCommHandle = 0; + + return errNone; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::PutIncomingData + * + * DESCRIPTION: Thread-safe method for adding data to the queue that + * holds data read from the serial port. + * + * PARAMETERS: data - pointer to the read data. + * len - number of bytes pointed to by "data". + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmHostTransportSerial::PutIncomingData (const void* data, long& len) +{ + if (len == 0) + return; + + omni_mutex_lock lock (fReadMutex); + + char* begin = (char*) data; + char* end = begin + len; + while (begin < end) + fReadBuffer.push_back (*begin++); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::GetIncomingData + * + * DESCRIPTION: Thread-safe method for getting data from the queue + * holding data read from the serial port. + * + * PARAMETERS: data - pointer to buffer to receive data. + * len - on input, number of bytes available in "data". + * On exit, number of bytes written to "data". + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmHostTransportSerial::GetIncomingData (void* data, long& len) +{ + omni_mutex_lock lock (fReadMutex); + + if (len > (long) fReadBuffer.size ()) + len = (long) fReadBuffer.size (); + + char* p = (char*) data; + deque<char>::iterator begin = fReadBuffer.begin (); + deque<char>::iterator end = begin + len; + + copy (begin, end, p); + fReadBuffer.erase (begin, end); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::IncomingDataSize + * + * DESCRIPTION: Thread-safe method returning the number of bytes in the + * read queue. + * + * PARAMETERS: None. + * + * RETURNED: Number of bytes in the read queue. + * + ***********************************************************************/ + +long EmHostTransportSerial::IncomingDataSize (void) +{ + omni_mutex_lock lock (fReadMutex); + + return fReadBuffer.size (); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::PutOutgoingData + * + * DESCRIPTION: Thread-safe method for adding data to the queue that + * holds data to be written to the serial port. + * + * PARAMETERS: data - pointer to the read data. + * len - number of bytes pointed to by "data". + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmHostTransportSerial::PutOutgoingData (const void* data, long& len) +{ + if (len == 0) + return; + + omni_mutex_lock lock (fWriteMutex); + + char* begin = (char*) data; + char* end = begin + len; + while (begin < end) + fWriteBuffer.push_back (*begin++); + + // Wake up CommWrite. + + fDataMutex.lock (); + fDataCondition.broadcast (); + fDataMutex.unlock (); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::GetOutgoingData + * + * DESCRIPTION: Thread-safe method for getting data from the queue + * holding data to be written to the serial port. + * + * PARAMETERS: data - pointer to buffer to receive data. + * len - on input, number of bytes available in "data". + * On exit, number of bytes written to "data". + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmHostTransportSerial::GetOutgoingData (void* data, long& len) +{ + omni_mutex_lock lock (fWriteMutex); + + if (len > (long) fWriteBuffer.size ()) + len = (long) fWriteBuffer.size (); + + char* p = (char*) data; + deque<char>::iterator begin = fWriteBuffer.begin (); + deque<char>::iterator end = begin + len; + + copy (begin, end, p); + fWriteBuffer.erase (begin, end); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::OutgoingDataSize + * + * DESCRIPTION: Thread-safe method returning the number of bytes in the + * write queue. + * + * PARAMETERS: None. + * + * RETURNED: Number of bytes in the read queue. + * + ***********************************************************************/ + +long EmHostTransportSerial::OutgoingDataSize (void) +{ + omni_mutex_lock lock (fWriteMutex); + + return fWriteBuffer.size (); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::CommRead + * + * DESCRIPTION: This function sits in its own thread, waiting for data + * to show up in the serial port. If data arrives, this + * function plucks it out and stores it in a thread-safe + * queue. It quits when it detects that the comm handle + * has been deleted. + * + * PARAMETERS: data - pointer to owning EmHostTransportSerial. + * + * RETURNED: Thread status. + * + ***********************************************************************/ + +void* EmHostTransportSerial::CommRead (void* data) +{ + EmHostTransportSerial* This = (EmHostTransportSerial*) data; + + PRINTF ("CommRead starting."); + + while (!This->fTimeToQuit) + { + int status; + int fd1 = This->fCommHandle; + int fd2 = This->fCommSignalPipeA; + int maxfd = max (fd1, fd2); + fd_set read_fds; + + FD_ZERO (&read_fds); + FD_SET (fd1, &read_fds); + FD_SET (fd2, &read_fds); + + status = select (maxfd + 1, &read_fds, NULL, NULL, NULL); + + if (This->fTimeToQuit) + break; + + if (status > 0) // data available + { + if (FD_ISSET (fd1, &read_fds)) + { + char buf[1024]; + int len = 1024; + len = read (fd1, buf, len); + + if (len == 0) + break; // port closed + + // Log the data. + if (LogSerialData ()) + LogAppendData (buf, len, "EmHostTransportSerial::CommRead: Received data:"); + else + PRINTF ("EmHostTransportSerial::CommRead: Received %ld serial bytes.", len); + + // Add the data to the EmHostTransportSerial object's buffer. + long n = (long) len; + This->PutIncomingData (buf, n); + } + } + } + + PRINTF ("CommRead exitting."); + + return NULL; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::CommWrite + * + * DESCRIPTION: This function sits in its own thread, waiting for data + * to show up in the write queue. If data arrives, this + * function plucks it out and sends it out to the port. It + * quits when it detects that the comm handle has been + * deleted. + * + * PARAMETERS: data - pointer to owning EmHostTransportSerial. + * + * RETURNED: Thread status. + * + ***********************************************************************/ + +void* EmHostTransportSerial::CommWrite (void* data) +{ + EmHostTransportSerial* This = (EmHostTransportSerial*) data; + + PRINTF ("CommWrite starting."); + + omni_mutex_lock lock (This->fDataMutex); + + while (!This->fTimeToQuit) + { + This->fDataCondition.wait (); + + // It's the EmHostTransportSerial object telling us to quit. + + if (This->fTimeToQuit) + break; + + // Get the data to write. + + long len = This->OutgoingDataSize (); + + // If there really wasn't any, go back to sleep. + + if (len == 0) + continue; + + // Get the data. + + void* buf = Platform::AllocateMemory (len); + This->GetOutgoingData (buf, len); + + // Log the data. + + if (LogSerialData ()) + LogAppendData (buf, len, "EmHostTransportSerial::CommWrite: Transmitted data:"); + else + PRINTF ("EmHostTransportSerial::CommWrite: Transmitted %ld serial bytes.", len); + + // Write the data. + + ::write (This->fCommHandle, buf, len); + + // Dispose of the data. + + Platform::DisposeMemory (buf); + } + + PRINTF ("CommWrite exitting."); + + return NULL; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::GetBaud + * + * DESCRIPTION: Map a baud rate into the Mac OS constant that represents + * that rate in a SerSettings call. + * + * PARAMETERS: baud - raw baud rate. + * + * RETURNED: Unix constant that represents that rate. + * + ***********************************************************************/ + +int EmHostTransportSerial::GetBaud (EmTransportSerial::Baud baud) +{ + switch (baud) + { +#if defined (B150) + case 150: PRINTF (" Baud = 150"); return B150; +#endif + +#if defined (B300) + case 300: PRINTF (" Baud = 300"); return B300; +#endif + +#if defined (B600) + case 600: PRINTF (" Baud = 600"); return B600; +#endif + +#if defined (B1200) + case 1200: PRINTF (" Baud = 1200"); return B1200; +#endif + +#if defined (B1800) + case 1800: PRINTF (" Baud = 1800"); return B1800; +#endif + +#if defined (B2400) + case 2400: PRINTF (" Baud = 2400"); return B2400; +#endif + +#if defined (B4800) + case 4800: PRINTF (" Baud = 4800"); return B4800; +#endif + +#if defined (B9600) + case 9600: PRINTF (" Baud = 9600"); return B9600; +#endif + +#if defined (B19200) + case 19200: PRINTF (" Baud = 19200"); return B19200; +#endif + +#if defined (B38400) + case 38400: PRINTF (" Baud = 38400"); return B38400; +#endif + +#if defined (B57600) + case 57600: PRINTF (" Baud = 57600"); return B57600; +#endif + +#if defined (B115200) + case 115200: PRINTF (" Baud = 115200"); return B115200; +#endif + +#if defined (B230400) + case 230400: PRINTF (" Baud = 230400"); return B230400; +#endif + } + + PRINTF (" Unknown Baud value: %ld.", (long) baud); + + // Not necessarily invalid. The UART often has invalid baud values while + // it's being initialized. It's also equally valid for a Palm application + // to attempt to set the baud to something the underlying OS doesn't support. + + // EmAssert (false); + + return baud; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportSerial::GetDataBits + * + * DESCRIPTION: Map a dataBits value into the Mac OS constant that + * represents that value in a SerSettings call. + * + * PARAMETERS: dataBits - raw data bits value. + * + * RETURNED: Unix constant that represents that dataBits value. + * + ***********************************************************************/ + +int EmHostTransportSerial::GetDataBits (EmTransportSerial::DataBits dataBits) +{ + switch (dataBits) + { + case 5: PRINTF (" dataBits = 5"); return CS5; + case 6: PRINTF (" dataBits = 6"); return CS6; + case 7: PRINTF (" dataBits = 7"); return CS7; + case 8: PRINTF (" dataBits = 8"); return CS8; + } + + PRINTF (" Unknown DataBits value."); + EmAssert (false); + return 0; +} + diff --git a/SrcUnix/EmTransportSerialUnix.h b/SrcUnix/EmTransportSerialUnix.h new file mode 100644 index 0000000..5b0fcc6 --- /dev/null +++ b/SrcUnix/EmTransportSerialUnix.h @@ -0,0 +1,68 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmTransportSerialUnix_h +#define EmTransportSerialUnix_h + +#include "EmTransportSerial.h" + +#include "omnithread.h" // omni_mutex +#include <deque> // deque + + +class EmHostTransportSerial +{ + public: + EmHostTransportSerial (void); + ~EmHostTransportSerial (void); + + ErrCode OpenCommPort (const EmTransportSerial::ConfigSerial&); + ErrCode CreateCommThreads (const EmTransportSerial::ConfigSerial&); + ErrCode DestroyCommThreads (void); + ErrCode CloseCommPort (void); + + // Manage data coming in the host serial port. + void PutIncomingData (const void*, long&); + void GetIncomingData (void*, long&); + long IncomingDataSize (void); + + // Manage data going out the host serial port. + void PutOutgoingData (const void*, long&); + void GetOutgoingData (void*, long&); + long OutgoingDataSize (void); + + static void* CommRead (void*); + static void* CommWrite (void*); + + int GetBaud (EmTransportSerial::Baud); + int GetDataBits (EmTransportSerial::DataBits); + + public: + omni_thread* fReadThread; + omni_thread* fWriteThread; + + int fCommHandle; + int fCommSignalPipeA; + int fCommSignalPipeB; + int fTimeToQuit; + omni_mutex fDataMutex; + omni_condition fDataCondition; + + omni_mutex fReadMutex; + deque<char> fReadBuffer; + + omni_mutex fWriteMutex; + deque<char> fWriteBuffer; +}; + +#endif /* EmTransportSerialUnix_h */ diff --git a/SrcUnix/EmTransportUSBUnix.cpp b/SrcUnix/EmTransportUSBUnix.cpp new file mode 100644 index 0000000..f8867a0 --- /dev/null +++ b/SrcUnix/EmTransportUSBUnix.cpp @@ -0,0 +1,394 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmTransportUSBUnix.h" + +#include "EmTransportSerial.h" // EmTransportSerial +#include "Logging.h" // LogSerial, LogAppendMsg + +#define PRINTF if (!LogSerial ()) ; else LogAppendMsg + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostHasUSB + * + * DESCRIPTION: Return whether or not USB facilities are available. + * + * PARAMETERS: None. + * + * RETURNED: True if the host has a USB port and we can use it. + * False otherwise. + * + ***********************************************************************/ + +Bool EmTransportUSB::HostHasUSB (void) +{ + return false; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostConstruct + * + * DESCRIPTION: Construct platform-specific objects/data. + * + * PARAMETERS: None + * + * RETURNED: The platform-specific serial object. + * + ***********************************************************************/ + +void EmTransportUSB::HostConstruct (void) +{ + fHost = new EmHostTransportUSB; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostDestruct + * + * DESCRIPTION: Destroy platform-specific objects/data. + * + * PARAMETERS: None. + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void EmTransportUSB::HostDestruct (void) +{ + delete fHost; + fHost = NULL; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostOpen + * + * DESCRIPTION: Open the serial port in a platform-specific fashion. + * + * PARAMETERS: None + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportUSB::HostOpen (void) +{ + fHost->fOpenLocally = true; + + fHost->UpdateOpenState (); + + return errNone; + +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostClose + * + * DESCRIPTION: Close the serial port in a platform-specific fashion. + * + * PARAMETERS: None + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportUSB::HostClose (void) +{ + fHost->fOpenLocally = false; + fHost->fOpenRemotely = false; + + ErrCode err = fHost->fSerialTransport->Close (); + + return err; + +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostRead + * + * DESCRIPTION: Read bytes from the port in a platform-specific fashion. + * + * PARAMETERS: len - maximum number of bytes to read. + * data - buffer to receive the bytes. + * + * RETURNED: 0 if no error. The number of bytes actually read is + * returned in len if there was no error. + * + ***********************************************************************/ + +ErrCode EmTransportUSB::HostRead (long& len, void* data) +{ + ErrCode err = serErrTimeOut; + len = 0; + + fHost->UpdateOpenState (); + + if (!fHost->FakeOpenConnection ()) + { + err = fHost->fSerialTransport->Read (len, data); + + if (err) + { + fHost->fOpenRemotely = false; + fHost->fSerialTransport->Close (); // Close it + } + } + + return err; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostWrite + * + * DESCRIPTION: Write bytes to the port in a platform-specific fashion. + * + * PARAMETERS: len - number of bytes in the buffer. + * data - buffer containing the bytes. + * + * RETURNED: 0 if no error. The number of bytes actually written is + * returned in len if there was no error. + * + ***********************************************************************/ + +ErrCode EmTransportUSB::HostWrite (long& len, const void* data) +{ + ErrCode err = errNone; + len = 0; + + fHost->UpdateOpenState (); + + if (!fHost->FakeOpenConnection ()) + { + err = fHost->fSerialTransport->Write (len, data); + + if (err) + { + fHost->fOpenRemotely = false; + fHost->fSerialTransport->Close (); // Close it + } + } + + return err; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostCanRead + * + * DESCRIPTION: Return whether or not the transport is available for + * a read operation (that is, it's connected to another + * entity). Does NOT indicate whether or not there are + * actually any bytes available to be read. + * + * PARAMETERS: None + * + * RETURNED: True if so. + * + ***********************************************************************/ + +Bool EmTransportUSB::HostCanRead (void) +{ + return fHost->fOpenLocally && fHost->fOpenRemotely; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostCanWrite + * + * DESCRIPTION: Return whether or not the transport is available for + * a write operation (that is, it's connected to another + * entity). Does NOT indicate whether or not there is + * actually any room in the transport's internal buffer + * for the data being written. + * + * PARAMETERS: None + * + * RETURNED: True if so. + * + ***********************************************************************/ + +Bool EmTransportUSB::HostCanWrite (void) +{ + return fHost->fOpenLocally && fHost->fOpenRemotely; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostBytesInBuffer + * + * DESCRIPTION: Returns the number of bytes that can be read with the + * Read method. Note that bytes may be received in + * between the time BytesInBuffer is called and the time + * Read is called, so calling the latter with the result + * of the former is not guaranteed to fetch all received + * and buffered bytes. + * + * PARAMETERS: None + * + * RETURNED: Number of bytes that can be read. + * + ***********************************************************************/ + +long EmTransportUSB::HostBytesInBuffer (long minBytes) +{ + long bytesRead = 0; + + fHost->UpdateOpenState (); + + if (!fHost->FakeOpenConnection ()) + { + try + { + bytesRead = fHost->fSerialTransport->BytesInBuffer (minBytes); + } + catch (ErrCode) + { + fHost->fOpenRemotely = false; + fHost->fSerialTransport->Close (); + } + } + + return bytesRead; +} + + +/*********************************************************************** + * + * FUNCTION: EmTransportUSB::HostSetConfig + * + * DESCRIPTION: Configure the serial port in a platform-specific + * fasion. The port is assumed to be open. + * + * PARAMETERS: config - configuration information. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +ErrCode EmTransportUSB::HostSetConfig (const ConfigUSB& /*config*/) +{ + ErrCode result = errNone; + + return result; +} + + +#pragma mark - + +/*********************************************************************** + * + * FUNCTION: EmHostTransportUSB c'tor + * + * DESCRIPTION: Constructor. Initialize our data members. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmHostTransportUSB::EmHostTransportUSB (void) : + fOpenLocally (false), + fOpenRemotely (false), + fSerialTransport (NULL) +{ + EmTransportSerial::ConfigSerial config; + + config.fPort = "USB"; + + fSerialTransport = dynamic_cast<EmTransportSerial*> (config.NewTransport ()); +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportUSB d'tor + * + * DESCRIPTION: Destructor. Delete our data members. + * + * PARAMETERS: None + * + * RETURNED: Nothing + * + ***********************************************************************/ + +EmHostTransportUSB::~EmHostTransportUSB (void) +{ + delete fSerialTransport; +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportUSB::UpdateOpenState + * + * DESCRIPTION: If we want the serial port transport open, and it's not + * open, then try opening it. + * + * PARAMETERS: None. + * + * RETURNED: 0 if no error. + * + ***********************************************************************/ + +void EmHostTransportUSB::UpdateOpenState (void) +{ + // If we need to open the USB driver and haven't done so, yet, then + // try to do so. + + if (fOpenLocally && // Do we need the USB driver open? + !fOpenRemotely && // Is it closed? + fSerialTransport->Open () == errNone) // Could we open it? + { + fOpenRemotely = true; // Say it's open + } +} + + +/*********************************************************************** + * + * FUNCTION: EmHostTransportUSB::FakeOpenConnection + * + * DESCRIPTION: If we've asked the driver to be open, but could not do + * so because the USB device is not online, then try to + * pretend that we're talking with a non-responsive serial + * device. + * + * PARAMETERS: None. + * + * RETURNED: True if HostOpen has been called, but the USB device is + * not yet online and we haven't been able to call Open on + * the underlying serial transport. False otherwise. + * + ***********************************************************************/ + +Bool EmHostTransportUSB::FakeOpenConnection (void) +{ + return fOpenLocally && !fOpenRemotely; +} diff --git a/SrcUnix/EmTransportUSBUnix.h b/SrcUnix/EmTransportUSBUnix.h new file mode 100644 index 0000000..32ccfd6 --- /dev/null +++ b/SrcUnix/EmTransportUSBUnix.h @@ -0,0 +1,36 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmTransportUSBUnix_h +#define EmTransportUSBUnix_h + +#include "EmTransportUSB.h" + +class EmTransportSerial; + +class EmHostTransportUSB +{ + public: + EmHostTransportUSB (void); + ~EmHostTransportUSB (void); + + void UpdateOpenState (void); + Bool FakeOpenConnection (void); + + public: + Bool fOpenLocally; + Bool fOpenRemotely; + EmTransportSerial* fSerialTransport; +}; + +#endif /* EmTransportUSBUnix_h */ diff --git a/SrcUnix/EmWindowFltk.cpp b/SrcUnix/EmWindowFltk.cpp new file mode 100644 index 0000000..ebf2ca7 --- /dev/null +++ b/SrcUnix/EmWindowFltk.cpp @@ -0,0 +1,777 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "EmWindowFltk.h" + +#include "EmApplication.h" // gApplication +#include "EmCommands.h" // EmCommandID +#include "EmDocument.h" // EmDocument +#include "EmMenusFltk.h" // HostCreatePopupMenu +#include "EmPixMapUnix.h" // ConvertPixMapToHost +#include "EmScreen.h" // EmScreenUpdateInfo +#include "EmSession.h" // EmKeyEvent, EmButtonEvent +#include "EmWindow.h" // EmWindow +#include "Platform.h" // Platform::AllocateMemory + +#include <FL/Fl.H> // Fl::event_x, event_y +#include <FL/Fl_Box.H> // Fl_Box +#include <FL/Fl_Image.H> // Fl_Image::draw +#include <FL/Fl_Menu_Button.H> // popup +#include <FL/fl_draw.H> // fl_color + +#include <ctype.h> // isprint, isxdigit + +#include "DefaultSmall.xpm" +#include "DefaultLarge.xpm" + +const int kDefaultWidth = 220; +const int kDefaultHeight = 330; + +#if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION == 0 +// FLTK 1.0.x had no separate Fl_RGB_Image subclass of Fl_Image. +#define Fl_RGB_Image Fl_Image +#endif + +EmWindowFltk* gHostWindow; + +// --------------------------------------------------------------------------- +// ¥ EmWindow::NewWindow +// --------------------------------------------------------------------------- + +EmWindow* EmWindow::NewWindow (void) +{ + // This is the type of window we should create. However, on Unix, we + // create one and only one window when we create the application. This + // method -- called by the document to create its window -- therefore + // doesn't need to actually create a window. + +// return new EmWindowFltk; + + EmAssert (gHostWindow != NULL); + return NULL; +} + + +#pragma mark - + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::EmWindowFltk +// --------------------------------------------------------------------------- + +EmWindowFltk::EmWindowFltk (void) : + Fl_Window (kDefaultWidth, kDefaultHeight, "pose"), + EmWindow (), + fMessage (NULL), + fCachedSkin (NULL) +{ + EmAssert (gHostWindow == NULL); + gHostWindow = this; + + this->box (FL_FLAT_BOX); + this->color (fl_gray_ramp (FL_NUM_GRAY - 1)); + + // Install a function to get called when the window is closed + // via a WM_DELETE_WINDOW message. + + this->callback (&EmWindowFltk::CloseCallback, NULL); + + // Ensure that the user can't resize this window. + + this->resizable (NULL); + + // Create the message to display when there's no session running. + + fMessage = new Fl_Box (0, 0, 200, 40, + "Right click on this window to show a menu of commands."); + fMessage->box (FL_NO_BOX); + fMessage->align (FL_ALIGN_CENTER | FL_ALIGN_WRAP | FL_ALIGN_INSIDE); + + this->end (); + + this->redraw (); // Redraw help message + + // Set the X-Windows window class. Normally, this is done when + // Fl_Window::show (argc, argv) is called (in main()). However, the + // EmWindow class gets in the way and automatically shows the host + // window by calling Fl_Window::show(). The latter does not set the + // window class. And even when the other "show" method is called later, + // the damage is done: the X Windows window is already created with a + // NULL window class. + // + // Setting the window class to the title of the window is a workaround + // at best. In previous versions of Poser, the window class would be + // set to the name of the executable. These should both be "pose", + // but it's possible for them to be different. + + this->xclass (this->label ()); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::~EmWindowFltk +// --------------------------------------------------------------------------- + +EmWindowFltk::~EmWindowFltk (void) +{ + this->PreDestroy (); + + // Get rid of the cached skin. + + this->CacheFlush (); + + EmAssert (gHostWindow == this); + gHostWindow = NULL; +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::CloseCallback +// --------------------------------------------------------------------------- +// When receiving the WM_CLOSE message on Windows or the WM_DELETE_WINDOW +// message on X, FLTK calls Fl::handle with the FL_CLOSE message. Fl::handle +// handles this message not by passing it to Fl_Window::handle, but by calling +// the window's installed callback function. By default, the callback +// function hides the window (presumably so that a main event loop would know +// it was time to quit by checking the window's visiblity). We override that +// behavior in order to treat the FL_CLOSE message in the same way as handling +// a Quit menu selection. + +void EmWindowFltk::CloseCallback (Fl_Widget*, void*) +{ + gApplication->HandleCommand (kCommandQuit); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::draw +// --------------------------------------------------------------------------- + +void EmWindowFltk::draw (void) +{ + if (gDocument) + { + this->HandleUpdate (); + } + else + { + fl_color (255, 255, 255); + fl_rect (0, 0, this->w (), this->h ()); + + fMessage->position ( + (this->w () - fMessage->w ()) / 2, + (this->h () - fMessage->h ()) / 3); + this->draw_child (*fMessage); + } +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::handle +// --------------------------------------------------------------------------- + +int EmWindowFltk::handle (int event) +{ + EmPoint where (Fl::event_x(), Fl::event_y()); + + switch (event) + { + case FL_PUSH: + if (Fl::event_button () == 3) + { + this->PopupMenu (); + return 1; + } + // Fall through... + + case FL_DRAG: + this->HandlePenEvent (where, true); + return 1; + + case FL_RELEASE: + this->HandlePenEvent (where, false); + return 1; + +/* + These don't seem to get called when we want them to... + + case FL_ACTIVATE: + this->HandleActivate (true); + return 1; + + case FL_DEACTIVATE: + this->HandleActivate (false); + return 1; +*/ + + case FL_FOCUS: + this->HandleActivate (true); + return 1; + + case FL_UNFOCUS: + this->HandleActivate (false); + return 1; + + case FL_SHORTCUT: + { + if (Fl::test_shortcut (FL_F + 10 | FL_SHIFT)) + { + this->PopupMenu (); + return 1; + } + + Fl_Menu_Item_List hostMenu; + this->GetHostMenu (hostMenu); + + const Fl_Menu_Item* selected = hostMenu[0].test_shortcut (); + if (selected) + { + this->DoMenuCommand (*selected); + return 1; + } + + return 0; + } + + case FL_KEYBOARD: + if (Fl::event_state (FL_ALT | FL_META)) + { + // Reserved for shortcuts + return 0; + } + + if (gDocument != NULL) + { + // Handle printable characters. + + if (strlen (Fl::event_text ()) > 0) + { + int key = (unsigned char) Fl::event_text()[0]; + EmKeyEvent event (key); + // !!! Need to get modifiers + gDocument->HandleKey (event); + return 1; + } + + // Handle all other characters. + + int c = Fl::event_key (); + + struct KeyConvert + { + int fEventKey; + SkinElementType fButton; + int fKey; + }; + + KeyConvert kConvert[] = + { + { FL_Enter, kElement_None, chrLineFeed }, + { FL_KP_Enter, kElement_None, chrLineFeed }, + { FL_Left, kElement_None, leftArrowChr }, + { FL_Right, kElement_None, rightArrowChr }, + { FL_Up, kElement_None, upArrowChr }, + { FL_Down, kElement_None, downArrowChr }, + { FL_F + 1, kElement_App1Button }, + { FL_F + 2, kElement_App2Button }, + { FL_F + 3, kElement_App3Button }, + { FL_F + 4, kElement_App4Button }, + { FL_F + 9, kElement_PowerButton }, + { FL_Page_Up, kElement_UpButton }, + { FL_Page_Down, kElement_DownButton } + }; + + for (size_t ii = 0; ii < countof (kConvert); ++ii) + { + if (c == kConvert[ii].fEventKey) + { + if (kConvert[ii].fButton != kElement_None) + { + gDocument->HandleButton (kConvert[ii].fButton, true); + gDocument->HandleButton (kConvert[ii].fButton, false); + return 1; + } + + if (kConvert[ii].fKey) + { + EmKeyEvent event (kConvert[ii].fKey); + // !!! Need to get modifiers + gDocument->HandleKey (event); + return 1; + } + } + } + + if (c == FL_F + 10) + { + this->PopupMenu (); + return 1; + } + + if (c < 0x100) + { + EmKeyEvent event (c); + // !!! Need to get modifiers + gDocument->HandleKey (event); + return 1; + } + } + + return 0; + } + + return Fl_Window::handle (event); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::PopupMenu +// --------------------------------------------------------------------------- + +void EmWindowFltk::PopupMenu (void) +{ + // Get the menu. + + Fl_Menu_Item_List hostMenu; + this->GetHostMenu (hostMenu); + + const Fl_Menu_Item* item = hostMenu[0].popup (Fl::event_x (), Fl::event_y ()); + if (item) + { + this->DoMenuCommand (*item); + } +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::GetHostMenu +// --------------------------------------------------------------------------- + +void EmWindowFltk::GetHostMenu (Fl_Menu_Item_List& hostMenu) +{ + EmMenu* menu = ::MenuFindMenu (kMenuPopupMenuPreferred); + EmAssert (menu); + + ::MenuUpdateMruMenus (*menu); + ::MenuUpdateMenuItemStatus (*menu); + ::HostCreatePopupMenu (*menu, hostMenu); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::DoMenuCommand +// --------------------------------------------------------------------------- + +void EmWindowFltk::DoMenuCommand (const Fl_Menu_Item& item) +{ + EmCommandID id = (EmCommandID) item.argument (); + + if (gDocument) + if (gDocument->HandleCommand (id)) + return; + + if (gApplication) + if (gApplication->HandleCommand (id)) + return; + + EmAssert (false); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::CacheFlush +// --------------------------------------------------------------------------- + +void EmWindowFltk::CacheFlush (void) +{ + delete fCachedSkin; + fCachedSkin = NULL; +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::CacheFlush +// --------------------------------------------------------------------------- + +Fl_Image* EmWindowFltk::GetSkin (void) +{ + if (!fCachedSkin) + { + const EmPixMap& p = this->GetCurrentSkin (); + EmPoint size = p.GetSize (); + + fCachedSkin = new Fl_RGB_Image ((uchar*) p.GetBits (), size.fX, size.fY, + 3, p.GetRowBytes ()); + } + + EmAssert (fCachedSkin); + + return fCachedSkin; +} + +#pragma mark - + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowReset +// --------------------------------------------------------------------------- +// Update the window's appearance due to a skin change. + +void EmWindowFltk::HostWindowReset (void) +{ + // Delete te old image. + + this->CacheFlush (); + + // Change the window to accomodate the settings and bitmap. + + // Get the desired client size. + + EmRect newBounds = this->GetCurrentSkinRegion ().Bounds (); + EmCoord w = newBounds.Width (); + EmCoord h = newBounds.Height (); + + // Protect against this function being called when their's + // no established skin. + + if (w == 0) + w = kDefaultWidth; + + if (h == 0) + h = kDefaultHeight; + + // Resize the window. + + this->size (w, h); + this->size_range (w, h, w, h); + + // Invalidate the window contents now (necessary?). + + this->redraw (); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostMouseCapture +// --------------------------------------------------------------------------- +// Capture the mouse so that all mouse events get sent to this window. + +void EmWindowFltk::HostMouseCapture (void) +{ + Fl::grab (this); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostMouseRelease +// --------------------------------------------------------------------------- +// Release the mouse so that mouse events get sent to the window the +// cursor is over. + +void EmWindowFltk::HostMouseRelease (void) +{ + Fl::grab (NULL); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostDrawingBegin +// --------------------------------------------------------------------------- +// Prepare the host window object for drawing outside of an update event. + +void EmWindowFltk::HostDrawingBegin (void) +{ + this->make_current (); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowMoveBy +// --------------------------------------------------------------------------- +// Move the host window object by the given offset. + +void EmWindowFltk::HostWindowMoveBy (const EmPoint& offset) +{ + this->HostWindowMoveTo (this->HostWindowBoundsGet ().TopLeft () + offset); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowMoveTo +// --------------------------------------------------------------------------- +// Move the host window object to the given location. + +void EmWindowFltk::HostWindowMoveTo (const EmPoint& loc) +{ + this->position (loc.fX, loc.fY); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowBoundsGet +// --------------------------------------------------------------------------- +// Get the global bounds of the host window object. + +EmRect EmWindowFltk::HostWindowBoundsGet (void) +{ + return EmRect ( + this->x (), + this->y (), + this->x () + this->w (), + this->y () + this->h ()); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowCenter +// --------------------------------------------------------------------------- +// Center the window to the main display. + +void EmWindowFltk::HostWindowCenter (void) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostWindowShow +// --------------------------------------------------------------------------- +// Make the host window object visible. + +void EmWindowFltk::HostWindowShow (void) +{ + + this->show (); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostRectFrame +// --------------------------------------------------------------------------- +// Draw a rectangle frame with the given width in the given color. + +void EmWindowFltk::HostRectFrame (const EmRect& r, const EmPoint& pen, const RGBType& color) +{ + EmRect r2 (r); + fl_color (color.fRed, color.fGreen, color.fBlue); + + // !!! This could be changed to not assume a square pen, but since + // we're kind of tied to that on Windows right now, that's the + // assumption we'll make. + + for (EmCoord size = 0; size < pen.fX; ++size) + { + fl_rect (r2.fLeft, r2.fTop, r2.Width (), r2.Height ()); + r2.Inset (1, 1); + } +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostOvalPaint +// --------------------------------------------------------------------------- +// Fill an oval with the given color. + +void EmWindowFltk::HostOvalPaint (const EmRect& r, const RGBType& color) +{ + fl_color (color.fRed, color.fGreen, color.fBlue); + fl_pie (r.fLeft, r.fTop, r.Width (), r.Height (), 0, 360); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostPaintCase +// --------------------------------------------------------------------------- +// Draw the skin. + +void EmWindowFltk::HostPaintCase (const EmScreenUpdateInfo&) +{ + Fl_Image* skin = this->GetSkin (); + skin->draw (0, 0); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostPaintLCD +// --------------------------------------------------------------------------- +// Draw the LCD area. info contains the raw LCD data, including a partically +// updated fImage, and fFirstList and fLastLine which indicate the valid +// range of the image. srcRect and destRect also indicate the range that +// needs to be updated, and have also been scaled appropriately. scaled is +// true if we need to scale info.fImage during the process of converting it +// to a host pixmap. + +void EmWindowFltk::HostPaintLCD (const EmScreenUpdateInfo& info, const EmRect& srcRect, + const EmRect& destRect, Bool scaled) +{ + // Determine the buffer size and allocate it. + // We assume that ConvertPixMapToHost is converting to 24-bit RGB. + + int rowBytes = srcRect.fRight * 3; + int bufferSize = srcRect.fBottom * rowBytes; + uchar* buffer = (uchar*) Platform::AllocateMemory (bufferSize); + + // Convert the image, scaling along the way. + + ::ConvertPixMapToHost (info.fImage, buffer, + info.fFirstLine, info.fLastLine, scaled); + + // Draw the converted image. + + fl_draw_image (buffer + srcRect.fTop * rowBytes, + destRect.fLeft, destRect.fTop, + destRect.Width (), destRect.Height ()); + + // Clean up. + + Platform::DisposeMemory (buffer); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostGetDefaultSkin +// --------------------------------------------------------------------------- +// Get the default (built-in) skin image. + +void EmWindowFltk::HostGetDefaultSkin (EmPixMap& pixMap, int scale) +{ + char** xpm = (scale == 2) ? DefaultLarge : DefaultSmall; + + /* + An XPM file is an array of strings composed of four sections: + + <Values> + <Colors> + <Pixels> + <Extensions> + + Each string is composed of words separated by spaces. + */ + + /* + <Values> is a string containing four or six integers in base + 10 that correspond to width, height, number of colors, number + of characters per pixel, and (optionally) hotspot location. + */ + + int w = 0; + int h = 0; + int num_colors = 0; + int cpp = 0; + int hot_x = 0; + int hot_y = 0; + int i = sscanf (xpm [0], "%d %d %d %d %d %d", &w, &h, &num_colors, + &cpp, &hot_x, &hot_y); + + EmAssert (i == 4); + EmAssert (w > 0); + EmAssert (h > 0); + EmAssert (num_colors > 0); + EmAssert (cpp == 1); + EmAssert (hot_x == 0); + EmAssert (hot_y == 0); + + /* + <Colors> contains as many lines as there are colors. Each string + contains the following words: + + <color_code> {<key> <color>}+ + */ + + RGBType colorMap[0x80]; + + for (int color_num = 0; color_num < num_colors; ++color_num) + { + const char* this_line = xpm [1 + color_num]; + int color_code = this_line[0]; + char key[3] = {0}; + char color[8] = {0}; + + i = sscanf (this_line + 1 + 1, "%s %s", key, color); + + EmAssert (i == 2); + EmAssert (strlen (key) == 1); + EmAssert (strlen (color) == 7); + EmAssert (key[0] == 'c'); + EmAssert (color[0] == '#'); + EmAssert (isxdigit (color[1])); + EmAssert (isxdigit (color[2])); + EmAssert (isxdigit (color[3])); + EmAssert (isxdigit (color[4])); + EmAssert (isxdigit (color[5])); + EmAssert (isxdigit (color[6])); + + int r, g, b; + i = sscanf (color, "#%2x%2x%2x", &r, &g, &b); + + EmAssert (i == 3); + EmAssert (isprint (color_code)); + + colorMap [color_code] = RGBType (r, g, b); + } + + /* + <Pixels> contains "h" lines, each containing cpp * "w" + characters in them. Each set of cpp characters maps to + one of the colors in the <Colors> array. + */ + + uint8* buffer = (uint8*) Platform::AllocateMemory (w * h * 3); + uint8* dest = buffer; + + for (int yy = 0; yy < h; ++yy) + { + char* src = xpm [1 + num_colors + yy]; + + for (int xx = 0; xx < w; ++xx) + { + int color_code = *src++; + EmAssert (isprint (color_code)); + + const RGBType& rgb = colorMap [color_code]; + + *dest++ = rgb.fRed; + *dest++ = rgb.fGreen; + *dest++ = rgb.fBlue; + } + } + + EmAssert ((dest - buffer) <= (w * h * 3)); + + // We now have the data in RGB format. Wrap it up in a temporary + // EmPixMap so that we can copy it into the result EmPixMap. + + EmPixMap wrapper; + + wrapper.SetSize (EmPoint (w, h)); + wrapper.SetFormat (kPixMapFormat24RGB); + wrapper.SetRowBytes (w * 3); + wrapper.SetBits (buffer); + + // Copy the data to the destination. + + pixMap = wrapper; + + // Clean up. + + Platform::DisposeMemory (buffer); +} + + +// --------------------------------------------------------------------------- +// ¥ EmWindowFltk::HostGetCurrentMouse +// --------------------------------------------------------------------------- +// Get the current mouse location. + +EmPoint EmWindowFltk::HostGetCurrentMouse (void) +{ + return EmPoint (Fl::event_x (), Fl::event_y ()); +} diff --git a/SrcUnix/EmWindowFltk.h b/SrcUnix/EmWindowFltk.h new file mode 100644 index 0000000..2d2ef06 --- /dev/null +++ b/SrcUnix/EmWindowFltk.h @@ -0,0 +1,78 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef EmWindowFltk_h +#define EmWindowFltk_h + +#include "EmWindow.h" // EmWindow + +#include <FL/Fl_Window.H> // Fl_Window +#include <vector> + +class Fl_Box; +class Fl_Image; +class Fl_Menu_Item; +typedef vector<Fl_Menu_Item> Fl_Menu_Item_List; + +class EmWindowFltk : public Fl_Window, public EmWindow +{ + public: + EmWindowFltk (void); + virtual ~EmWindowFltk (void); + + void PopupMenu (void); + void GetHostMenu (Fl_Menu_Item_List&); + void DoMenuCommand (const Fl_Menu_Item&); + + void CacheFlush (void); + Fl_Image* GetSkin (void); + + private: + virtual void draw (void); + virtual int handle (int event); + static void CloseCallback (Fl_Widget*, void*); + + private: + virtual void HostWindowReset (void); + + virtual void HostMouseCapture (void); + virtual void HostMouseRelease (void); + + virtual void HostDrawingBegin (void); + + virtual void HostWindowMoveBy (const EmPoint&); + virtual void HostWindowMoveTo (const EmPoint&); + virtual EmRect HostWindowBoundsGet (void); + virtual void HostWindowCenter (void); + virtual void HostWindowShow (void); + + virtual void HostRectFrame (const EmRect&, const EmPoint&, const RGBType&); + virtual void HostOvalPaint (const EmRect&, const RGBType&); + + virtual void HostPaintCase (const EmScreenUpdateInfo&); + virtual void HostPaintLCD (const EmScreenUpdateInfo& info, + const EmRect& srcRect, + const EmRect& destRect, + Bool scaled); + + virtual void HostGetDefaultSkin (EmPixMap&, int scale); + virtual EmPoint HostGetCurrentMouse (void); + + private: + Fl_Box* fMessage; + Fl_Image* fCachedSkin; +}; + +extern EmWindowFltk* gHostWindow; + +#endif // EmWindowFltk_h diff --git a/SrcUnix/Platform_Unix.cpp b/SrcUnix/Platform_Unix.cpp new file mode 100644 index 0000000..9f9a918 --- /dev/null +++ b/SrcUnix/Platform_Unix.cpp @@ -0,0 +1,850 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1998-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#include "EmCommon.h" +#include "Platform.h" + +#include "ErrorHandling.h" // Errors::ThrowIfNULL +#include "Miscellaneous.h" // StMemory +//#include "PreferenceMgr.h" +#include "ResStrings.h" +#include "SessionFile.h" +#include "Strings.r.h" // kStr_ ... + +#include <errno.h> // EPERM, ENOENT, etc. +#include <unistd.h> +#include <sys/time.h> +#include <sys/stat.h> // mkdir +#include <time.h> +#include <ctype.h> + +#include "omnithread.h" // omni_mutex +#include <FL/x.H> // XKeyboardControl +#include <FL/Fl.H> // Fl::args + + +// =========================================================================== +// ¥ Globals +// =========================================================================== + +ByteList gClipboardDataPalm; +ByteList gClipboardDataHost; +omni_mutex gClipboardMutex; +omni_condition gClipboardCondition (&gClipboardMutex); +Bool gClipboardHaveOutgoingData; +Bool gClipboardNeedIncomingData; +Bool gClipboardPendingIncomingData; +Bool gClipboardHaveIncomingData; + +long long PrvGetMicroseconds (void) +{ + struct timeval tv; + gettimeofday (&tv, NULL); + + long long usecs = ((long long) tv.tv_sec) * 1000000ULL + tv.tv_usec; + + return usecs; +} + + +// =========================================================================== +// ¥ Platform +// =========================================================================== + +#ifndef __QNXNTO__ +// Compare lexigraphically two strings + +int _stricmp( const char *s1, const char *s2 ) +{ + return strcasecmp( s1, s2 ); +} + +int _strnicmp( const char *s1, const char *s2, int n ) +{ + return strncasecmp( s1, s2, n ); +} + +char* _strdup( const char *s ) +{ + return strdup( s ); +} +#endif + + +// --------------------------------------------------------------------------- +// ¥ Platform::Initialize +// --------------------------------------------------------------------------- +// Initializes platform-dependent stuff. + +void Platform::Initialize( void ) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::Reset +// --------------------------------------------------------------------------- + +void Platform::Reset( void ) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::Save +// --------------------------------------------------------------------------- + +void Platform::Save(SessionFile&) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::Load +// --------------------------------------------------------------------------- + +void Platform::Load(SessionFile&) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::Dispose +// --------------------------------------------------------------------------- + +void Platform::Dispose( void ) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::GetString +// --------------------------------------------------------------------------- + +string Platform::GetString( StrCode id ) +{ + const char* str = _ResGetString (id); + if (str) + return string (str); + + char buffer[20]; + sprintf (buffer, "%ld", (long) id); + return string ("<missing string ") + buffer + ">"; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::GetIDForError +// --------------------------------------------------------------------------- + +int Platform::GetIDForError( ErrCode error ) +{ + switch (error) + { + // From /usr/include/asm/errno.h + + case EPERM: break; // 1 /* Operation not permitted */ + case ENOENT: return kStr_FileNotFound; // 2 /* No such file or directory */ + case ESRCH: break; // 3 /* No such process */ + case EINTR: break; // 4 /* Interrupted system call */ + case EIO: return kStr_IOError; // 5 /* I/O error */ + case ENXIO: break; // 6 /* No such device or address */ + case E2BIG: break; // 7 /* Arg list too long */ + case ENOEXEC: break; // 8 /* Exec format error */ + case EBADF: break; // 9 /* Bad file number */ + case ECHILD: break; // 10 /* No child processes */ + case EAGAIN: break; // 11 /* Try again */ + case ENOMEM: return kStr_MemFull; // 12 /* Out of memory */ + case EACCES: return kStr_SerialPortBusy; // 13 /* Permission denied */ + case EFAULT: break; // 14 /* Bad address */ + case ENOTBLK: break; // 15 /* Block device required */ + case EBUSY: return kStr_FileBusy; // 16 /* Device or resource busy */ + case EEXIST: return kStr_DuplicateFileName; // 17 /* File exists */ + case EXDEV: break; // 18 /* Cross-device link */ + case ENODEV: return kStr_DiskMissing; // 19 /* No such device */ + case ENOTDIR: break; // 20 /* Not a directory */ + case EISDIR: break; // 21 /* Is a directory */ + case EINVAL: break; // 22 /* Invalid argument */ + case ENFILE: break; // 23 /* File table overflow */ + case EMFILE: return kStr_TooManyFilesOpen; // 24 /* Too many open files */ + case ENOTTY: break; // 25 /* Not a typewriter */ + case ETXTBSY: return kStr_FileBusy; // 26 /* Text file busy */ + case EFBIG: break; // 27 /* File too large */ + case ENOSPC: return kStr_DiskFull; // 28 /* No space left on device */ + case ESPIPE: break; // 29 /* Illegal seek */ + case EROFS: return kStr_DiskWriteProtected; // 30 /* Read-only file system */ + case EMLINK: break; // 31 /* Too many links */ + case EPIPE: break; // 32 /* Broken pipe */ + case EDOM: break; // 33 /* Math argument out of domain of func */ + case ERANGE: break; // 34 /* Math result not representable */ + case EDEADLK: break; // 35 /* Resource deadlock would occur */ + case ENAMETOOLONG: return kStr_BadFileName; // 36 /* File name too long */ + +#if 0 + // Comment out this whole block. We don't map them to any specific + // error messages, and by commenting them out, we protect ourselves + // against any Unixen that don't define them. + + case ENOLCK: break; // 37 /* No record locks available */ + case ENOSYS: break; // 38 /* Function not implemented */ + case ENOTEMPTY: break; // 39 /* Directory not empty */ + case ELOOP: break; // 40 /* Too many symbolic links encountered */ +// case EWOULDBLOCK: break; // EAGAIN /* Operation would block */ + case ENOMSG: break; // 42 /* No message of desired type */ + case EIDRM: break; // 43 /* Identifier removed */ + case ECHRNG: break; // 44 /* Channel number out of range */ + case EL2NSYNC: break; // 45 /* Level 2 not synchronized */ + case EL3HLT: break; // 46 /* Level 3 halted */ + case EL3RST: break; // 47 /* Level 3 reset */ + case ELNRNG: break; // 48 /* Link number out of range */ + case EUNATCH: break; // 49 /* Protocol driver not attached */ + case ENOCSI: break; // 50 /* No CSI structure available */ + case EL2HLT: break; // 51 /* Level 2 halted */ + case EBADE: break; // 52 /* Invalid exchange */ + case EBADR: break; // 53 /* Invalid request descriptor */ + case EXFULL: break; // 54 /* Exchange full */ + case ENOANO: break; // 55 /* No anode */ + case EBADRQC: break; // 56 /* Invalid request code */ + case EBADSLT: break; // 57 /* Invalid slot */ + +// case EDEADLOCK: break; // EDEADLK + + case EBFONT: break; // 59 /* Bad font file format */ + case ENOSTR: break; // 60 /* Device not a stream */ + case ENODATA: break; // 61 /* No data available */ + case ETIME: break; // 62 /* Timer expired */ + case ENOSR: break; // 63 /* Out of streams resources */ + case ENONET: break; // 64 /* Machine is not on the network */ + case ENOPKG: break; // 65 /* Package not installed */ + case EREMOTE: break; // 66 /* Object is remote */ + case ENOLINK: break; // 67 /* Link has been severed */ + case EADV: break; // 68 /* Advertise error */ + case ESRMNT: break; // 69 /* Srmount error */ + case ECOMM: break; // 70 /* Communication error on send */ + case EPROTO: break; // 71 /* Protocol error */ + case EMULTIHOP: break; // 72 /* Multihop attempted */ + case EDOTDOT: break; // 73 /* RFS specific error */ + case EBADMSG: break; // 74 /* Not a data message */ + case EOVERFLOW: break; // 75 /* Value too large for defined data type */ + case ENOTUNIQ: break; // 76 /* Name not unique on network */ + case EBADFD: break; // 77 /* File descriptor in bad state */ + case EREMCHG: break; // 78 /* Remote address changed */ + case ELIBACC: break; // 79 /* Can not access a needed shared library */ + case ELIBBAD: break; // 80 /* Accessing a corrupted shared library */ + case ELIBSCN: break; // 81 /* .lib section in a.out corrupted */ + case ELIBMAX: break; // 82 /* Attempting to link in too many shared libraries */ + case ELIBEXEC: break; // 83 /* Cannot exec a shared library directly */ + case EILSEQ: break; // 84 /* Illegal byte sequence */ + case ERESTART: break; // 85 /* Interrupted system call should be restarted */ + case ESTRPIPE: break; // 86 /* Streams pipe error */ + case EUSERS: break; // 87 /* Too many users */ + case ENOTSOCK: break; // 88 /* Socket operation on non-socket */ + case EDESTADDRREQ: break; // 89 /* Destination address required */ + case EMSGSIZE: break; // 90 /* Message too long */ + case EPROTOTYPE: break; // 91 /* Protocol wrong type for socket */ + case ENOPROTOOPT: break; // 92 /* Protocol not available */ + case EPROTONOSUPPORT: break; // 93 /* Protocol not supported */ + case ESOCKTNOSUPPORT: break; // 94 /* Socket type not supported */ + case EOPNOTSUPP: break; // 95 /* Operation not supported on transport endpoint */ + case EPFNOSUPPORT: break; // 96 /* Protocol family not supported */ + case EAFNOSUPPORT: break; // 97 /* Address family not supported by protocol */ + case EADDRINUSE: break; // 98 /* Address already in use */ + case EADDRNOTAVAIL: break; // 99 /* Cannot assign requested address */ + case ENETDOWN: break; // 100 /* Network is down */ + case ENETUNREACH: break; // 101 /* Network is unreachable */ + case ENETRESET: break; // 102 /* Network dropped connection because of reset */ + case ECONNABORTED: break; // 103 /* Software caused connection abort */ + case ECONNRESET: break; // 104 /* Connection reset by peer */ + case ENOBUFS: break; // 105 /* No buffer space available */ + case EISCONN: break; // 106 /* Transport endpoint is already connected */ + case ENOTCONN: break; // 107 /* Transport endpoint is not connected */ + case ESHUTDOWN: break; // 108 /* Cannot send after transport endpoint shutdown */ + case ETOOMANYREFS: break; // 109 /* Too many references: cannot splice */ + case ETIMEDOUT: break; // 110 /* Connection timed out */ + case ECONNREFUSED: break; // 111 /* Connection refused */ + case EHOSTDOWN: break; // 112 /* Host is down */ + case EHOSTUNREACH: break; // 113 /* No route to host */ + case EALREADY: break; // 114 /* Operation already in progress */ + case EINPROGRESS: break; // 115 /* Operation now in progress */ + case ESTALE: break; // 116 /* Stale NFS file handle */ + case EUCLEAN: break; // 117 /* Structure needs cleaning */ + case ENOTNAM: break; // 118 /* Not a XENIX named type file */ + case ENAVAIL: break; // 119 /* No XENIX semaphores available */ + case EISNAM: break; // 120 /* Is a named type file */ + case EREMOTEIO: break; // 121 /* Remote I/O error */ + case EDQUOT: break; // 122 /* Quota exceeded */ + + case ENOMEDIUM: break; // 123 /* No medium found */ + case EMEDIUMTYPE: break; // 124 /* Wrong medium type */ +#endif + } + + return 0; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::GetIDForRecovery +// --------------------------------------------------------------------------- + +int Platform::GetIDForRecovery( ErrCode error ) +{ + return 0; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::GetShortVersionString +// --------------------------------------------------------------------------- +// Returns a short version string. The format of the string is: +// +// #.# (.#) ([dab]#) +// +// # = one or more numeric digits +// . = literal '.' +// Patterns in parentheses are optional +// Patterns in brackets mean "one of these characters" +// Spaces are shown above for clarity; they do not appear in the string +// +// Valid strings would be: 2.1d7, 2.1.1b14, 2.99, 2.1.1 + +string Platform::GetShortVersionString( void ) +{ + return string("3.5"); +} + + +/*********************************************************************** + * + * FUNCTION: Platform::CopyToClipboard + * + * DESCRIPTION: + * + * PARAMETERS: none + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void Platform::CopyToClipboard (const ByteList& palmChars, + const ByteList& hostChars) +{ + ByteList palmChars2 (palmChars); + ByteList hostChars2 (hostChars); + + // See if any mapping needs to be done. + + if (hostChars2.size () > 0 && palmChars2.size () == 0) + { + Platform::RemapHostToPalmChars (hostChars2, palmChars2); + } + else if (palmChars2.size () > 0 && hostChars2.size () == 0) + { + Platform::RemapPalmToHostChars (palmChars2, hostChars2); + } + + omni_mutex_lock lock (gClipboardMutex); + + gClipboardDataPalm = palmChars2; + gClipboardDataHost = hostChars2; + + gClipboardHaveOutgoingData = true; +} + + +/*********************************************************************** + * + * FUNCTION: Platform::CopyFromClipboard + * + * DESCRIPTION: + * + * PARAMETERS: none + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void Platform::CopyFromClipboard (ByteList& palmChars, + ByteList& hostChars) +{ + omni_mutex_lock lock (gClipboardMutex); + + gClipboardNeedIncomingData = true; + gClipboardHaveIncomingData = false; + + while (!gClipboardHaveIncomingData) + gClipboardCondition.wait (); + + // Copy the data to our outgoing lists. + + palmChars = gClipboardDataPalm; + hostChars = gClipboardDataHost; + + // See if any mapping needs to be done. + + if (hostChars.size () > 0 && palmChars.size () == 0) + { + Platform::RemapHostToPalmChars (hostChars, palmChars); + } + else if (palmChars.size () > 0 && hostChars.size () == 0) + { + Platform::RemapPalmToHostChars (palmChars, hostChars); + } +} + + +/*********************************************************************** + * + * FUNCTION: Platform::RemapHostToPalmChars + * + * DESCRIPTION: + * + * PARAMETERS: none + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void Platform::RemapHostToPalmChars (const ByteList& hostChars, + ByteList& palmChars) +{ + // Converting line endings is all we do for now. + + ByteList::const_iterator iter = hostChars.begin (); + while (iter != hostChars.end ()) + { + uint8 ch = *iter++; + + if (ch == 0x0A) + { + palmChars.push_back (chrLineFeed); + } + else + { + palmChars.push_back (ch); + } + } +} + + +/*********************************************************************** + * + * FUNCTION: Platform::RemapHostToPalmChars + * + * DESCRIPTION: + * + * PARAMETERS: none + * + * RETURNED: Nothing + * + ***********************************************************************/ + +void Platform::RemapPalmToHostChars (const ByteList& palmChars, + ByteList& hostChars) +{ + // Converting line endings is all we do for now. + + ByteList::const_iterator iter = palmChars.begin (); + while (iter != palmChars.end ()) + { + uint8 ch = *iter++; + + if (ch == chrLineFeed) + { + hostChars.push_back (0x0A); + } + else + { + hostChars.push_back (ch); + } + } +} + + +/*********************************************************************** + * + * FUNCTION: Platform::PinToScreen + * + * DESCRIPTION: + * + * PARAMETERS: None + * + * RETURNED: True if the rectangle was changed. + * + ***********************************************************************/ + +Bool Platform::PinToScreen (EmRect& r) +{ + // !!! TBD + return false; +} + + +/*********************************************************************** + * + * FUNCTION: ToHostEOL + * + * DESCRIPTION: Converts a string of characters into another string + * where the EOL sequence is consistant for files on the + * current platform. + * + * PARAMETERS: dest - receives the result. The buffer is sized by + * this function, so the caller doesn't have to + * allocate any space itself. + * + * destLen - receives the length of the resulting string. + * + * src - pointer to input characters. + * + * srcLen - number of characters pointed to by src. + * + * RETURNED: Nothing. + * + ***********************************************************************/ + +void Platform::ToHostEOL ( StMemory& dest, long& destLen, + const char* src, long srcLen) +{ + char* d = (char*) Platform::AllocateMemory (srcLen); + char* p = d; + Bool previousWas0x0D = false; + + for (long ii = 0; ii < srcLen; ++ii) + { + char ch = src[ii]; + + // Convert 0x0D to 0x0A. + + if (ch == 0x0D) + { + *p++ = 0x0A; + } + + // If we're looking at a 0x0A that's part of + // a 0x0D/0x0A, just swallow it. + + else if (ch == 0x0A && previousWas0x0D) + { + // Nothing + } + + // Copy all other characters straight through. + + else + { + *p++ = ch; + } + + previousWas0x0D = ch == 0x0D; + } + + destLen = p - d; + d = (char*) Platform::ReallocMemory (d, destLen); + dest.Adopt (d); +} + + +// ----------------------------------------------------------------------------- +// find the ROM file path embedded in the saved ram image + +Bool Platform::ReadROMFileReference (ChunkFile& docFile, EmFileRef& f) +{ + // First look for a ROM file path. + + string path; + if (docFile.ReadString (SessionFile::kROMUnixPathTag, path)) + { + f = EmFileRef (path); + return true; + } + + // If a path can't be found, look for a simple ROM name. + + string name; + if (docFile.ReadString (SessionFile::kROMNameTag, name)) + { + // !!! TBD + } + + return false; +} + +void Platform::WriteROMFileReference (ChunkFile& docFile, const EmFileRef& f) +{ + docFile.WriteString (SessionFile::kROMUnixPathTag, f.GetFullPath ()); +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::Delay +// --------------------------------------------------------------------------- +// Delay for a time period appropriate for a sleeping 68328. + +void Platform::Delay (void) +{ + // Delay 10 msecs. Delaying by this amount pauses us 1/100 of a second, + // which is the rate at which the device's tickcount counter increments. + // + // Wait on an event instead of just calling Sleep(10) so that another + // thread can wake us up before our time. + + omni_thread::sleep( 0, 10000 ); // 10k nanoseconds = 1/100 sec +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::CycleSlowly +// --------------------------------------------------------------------------- + +void Platform::CycleSlowly (void) +{ + // Nothing to do in Unix. +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::RealAllocateMemory +// --------------------------------------------------------------------------- + +void* Platform::RealAllocateMemory (size_t size, Bool clear, const char*, int) +{ + void* result; + + if (clear) + result = calloc (size, 1); + else + result = malloc (size); + + Errors::ThrowIfNULL (result); + + return result; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::RealReallocMemory +// --------------------------------------------------------------------------- + +void* Platform::RealReallocMemory (void* p, size_t size, const char*, int) +{ + void* result = realloc (p, size); + + Errors::ThrowIfNULL (result); + + return result; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::RealDisposeMemory +// --------------------------------------------------------------------------- + +void Platform::RealDisposeMemory (void* p) +{ + if (p) + { + free (p); + } +} + + +/*********************************************************************** + * + * FUNCTION: Platform::ForceStartupScreen + * + * DESCRIPTION: See if the user has requested that the Startup dialog + * be presented instead of attempting to use the latest + * session file or creation settings. + * + * The current signal is to toggle the CAPSLOCK key. + * + * PARAMETERS: none + * + * RETURNED: True if the user has signalled that the dialog should + * be presented. + * + ***********************************************************************/ + +Bool Platform::ForceStartupScreen (void) +{ + return false; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::StopOnResetKeyDown +// --------------------------------------------------------------------------- + +Bool Platform::StopOnResetKeyDown( void ) +{ + // Comment this out for now. It seems that Windows doesn't always return + // the expected result. That is, this function often returns TRUE even + // though the Control is not down. + // + // Since this functionality is really only required by Palm OS engineers, + // and since they're working on Macs, we don't really need this feature + // in the Windows version now anyway. + +// return ::GetAsyncKeyState (VK_CONTROL) != 0; + return false; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::CollectOptions +// --------------------------------------------------------------------------- + +int Platform::CollectOptions (int argc, char** argv, int& errorArg, int (*cb)(int, char**, int&)) +{ + if (!Fl::args (argc, argv, errorArg, cb) || errorArg < argc - 1) + return false; + + return true; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::PrintHelp +// --------------------------------------------------------------------------- + +void Platform::PrintHelp (void) +{ + printf ("%s\n", Fl::help); +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::GetMilliseconds +// --------------------------------------------------------------------------- + +uint32 Platform::GetMilliseconds( void ) +{ + long long usecs = ::PrvGetMicroseconds (); + uint32 millis = (uint32) (usecs / 1000); + + return millis; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::CreateDebuggerSocket +// --------------------------------------------------------------------------- + +CSocket* Platform::CreateDebuggerSocket (void) +{ + return NULL; +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::ExitDebugger +// --------------------------------------------------------------------------- +// Perform platform-specific operations when debug mode is exited. + +void Platform::ExitDebugger( void ) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::ViewDrawLine +// --------------------------------------------------------------------------- + +void Platform::ViewDrawLine( int xStart, int yStart, int xEnd, int yEnd ) +{ +} + + +// --------------------------------------------------------------------------- +// ¥ Platform::ViewDrawPixel +// --------------------------------------------------------------------------- + +void Platform::ViewDrawPixel( int xPos, int yPos ) +{ +} + + +static void PrvQueueNote (int frequency, int duration, int amplitude) +{ + // Use XBell under X to play a simple tone. For more advanced + // sound functionality, direct synth manipulation (under Linux), + // or wave playback (probably via Esound), would be needed. + + // !TODO: figure out how to get XGetKeyboardControl working, so + // that the actual keyboard state can be restored, instead of + // just "the default". + + if (duration > 0 && amplitude > 0) + { + XKeyboardControl new_state; + + /* fl_display global contains the XDisplay of the last + "current" fltk widget, under X/Windows */ + + new_state.bell_percent = amplitude * 100 / 64; + new_state.bell_pitch = frequency; + new_state.bell_duration = duration; + + XChangeKeyboardControl (fl_display, + KBBellPercent | KBBellPitch | KBBellDuration, + &new_state); + + XBell (fl_display, 100); // Give beep command + XFlush (fl_display); // Flush beep command to the server + omni_thread::sleep (0, duration * 1000000); // wait for asynch beep + + /* Put bell state back to "default" values */ + + new_state.bell_percent = -1; + new_state.bell_pitch = -1; + new_state.bell_duration = -1; + + XChangeKeyboardControl (fl_display, + KBBellPercent | KBBellPitch | KBBellDuration, + &new_state); + } +} + + +CallROMType Platform::SndDoCmd (SndCommandType& cmd) +{ + switch (cmd.cmd) + { + case sndCmdFreqDurationAmp: + PrvQueueNote (cmd.param1, cmd.param2, cmd.param3); + break; + + case sndCmdNoteOn: + return kExecuteROM; + + case sndCmdFrqOn: + PrvQueueNote (cmd.param1, cmd.param2, cmd.param3); + break; + + case sndCmdQuiet: + return kExecuteROM; + } + + return kSkipROM; +} + +void Platform::StopSound (void) +{ +} + + +void Platform::Beep (void) +{ + XBell (fl_display, 100); // Give beep command. Make it loud + XFlush (fl_display); // Flush beep command to the server +} diff --git a/SrcUnix/ResStrings.h b/SrcUnix/ResStrings.h new file mode 100644 index 0000000..0b56a1f --- /dev/null +++ b/SrcUnix/ResStrings.h @@ -0,0 +1,19 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* ===================================================================== *\ + Copyright (c) 1999-2001 Palm, Inc. or its subsidiaries. + All rights reserved. + + This file is part of the Palm OS Emulator. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. +\* ===================================================================== */ + +#ifndef __RESSTRINGS_H__ +#define __RESSTRINGS_H__ + +const char *_ResGetString(int idx); + +#endif /* __RESSTRINGS_H__ */ diff --git a/SrcUnix/espws-2.0/CheckButton.cxx b/SrcUnix/espws-2.0/CheckButton.cxx new file mode 100644 index 0000000..3fad85e --- /dev/null +++ b/SrcUnix/espws-2.0/CheckButton.cxx @@ -0,0 +1,113 @@ +// +// "$Id: CheckButton.cxx,v 1.10 2000/01/04 13:45:50 mike Exp $" +// +// CheckButton routines for the Common UNIX Printing System (CUPS). +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "LICENSE.txt" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: CUPS Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9603 +// EMail: cups-info@cups.org +// WWW: http://www.cups.org +// +// Contents: +// + +// +// Include necessary header files... +// + +#include <FL/Fl.H> +#include "CheckButton.h" +#include <FL/fl_draw.H> + + +// +// CheckButton is a subclass of Fl_Button like Fl_Check_Button, only the +// toggle and radio images are more like Microsoft Windows. +// + + +// +// 'CheckButton::draw()' - Draw the check button. +// + +void CheckButton::draw() +{ + int size, // Size of button... + offset; // Box Y offset... + + size = labelsize(); + offset = (h() - size) / 2; + + if (type() == FL_RADIO_BUTTON) + { + // Draw the radio "hole"... + draw_box(FL_ROUND_DOWN_BOX, x(), y() + offset, size, size, FL_WHITE); + + // Then the check... + if (value()) + { + fl_color(active_r() ? FL_BLACK : FL_GRAY); + + if (size > 14) + fl_pie(x() + 5, y() + offset + 5, size - 10, size - 10, 0.0, 360.0); + else + { + // Small circles don't draw well with some X servers... + fl_rect(x() + 6, y() + offset + 5, 2, 4); + fl_rect(x() + 5, y() + offset + 6, 4, 2); + } + } + } + else + { + // Draw the check "box"... + draw_box(FL_DOWN_BOX, x(), y() + offset, size, size, FL_WHITE); + + // Then the check... + if (value()) + { + fl_color(active_r() ? FL_BLACK : FL_GRAY); + fl_line(x() + 3, y() + offset + 3, + x() + size - 4, y() + offset + size - 4); + fl_line(x() + 4, y() + offset + 3, + x() + size - 3, y() + offset + size - 4); + fl_line(x() + 3, y() + offset + size - 4, + x() + size - 4, y() + offset + 3); + fl_line(x() + 4, y() + offset + size - 4, + x() + size - 3, y() + offset + 3); + } + } + + // Finally, the label... + draw_label(x() + 5 * size / 4, y(), w() - 5 * size / 4, h()); +} + + +// +// 'CheckButton::CheckButton()' - Construct a CheckButton widget. +// + +CheckButton::CheckButton(int x, int y, int w, int h, const char* l) +: Fl_Button(x, y, w, h, l) +{ + type(FL_TOGGLE_BUTTON); + align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); +} + + +// +// End of "$Id: CheckButton.cxx,v 1.10 2000/01/04 13:45:50 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/CheckButton.h b/SrcUnix/espws-2.0/CheckButton.h new file mode 100644 index 0000000..77d9273 --- /dev/null +++ b/SrcUnix/espws-2.0/CheckButton.h @@ -0,0 +1,52 @@ +// +// "$Id: CheckButton.h,v 1.3 2000/01/04 13:45:50 mike Exp $" +// +// CheckButton definitions for the Common UNIX Printing System (CUPS). +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "LICENSE.txt" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: CUPS Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9603 +// EMail: cups-info@cups.org +// WWW: http://www.cups.org +// + +#ifndef _CHECKBUTTON_H_ +# define _CHECKBUTTON_H_ + +// +// Include necessary headers. +// + +#include <FL/Fl_Button.H> + + +// +// CheckButton class... +// + +class CheckButton : public Fl_Button +{ +protected: + virtual void draw(); + +public: + CheckButton(int x, int y, int w, int h, const char *l = 0); +}; + +#endif // !_CHECKBUTTON_H_ + +// +// End of "$Id: CheckButton.h,v 1.3 2000/01/04 13:45:50 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/CheckButton.html b/SrcUnix/espws-2.0/CheckButton.html new file mode 100644 index 0000000..d8f0de8 --- /dev/null +++ b/SrcUnix/espws-2.0/CheckButton.html @@ -0,0 +1,61 @@ +<HTML> +<HEAD> + <TITLE>CheckButton - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class CheckButton</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Group + | + +----<B>CheckButton</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "CheckButton.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>CheckButton</CODE> widget provides a better looking check or +radio button. It is otherwise identical to the <CODE>Fl_Check_Button</CODE> +widget. + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#CheckButton.CheckButton">CheckButton</A> + <LI><A HREF="#CheckButton.~CheckButton">~CheckButton</A> + +</UL> + +<H4><A NAME="CheckButton.CheckButton">CheckButton(int xx, int yy, int ww, int hh, const char *l = 0)</A></H4> + +<P>The constructor creates the <CODE>CheckButton</CODE> widget at the specified +position and size. + +<H4><A NAME="CheckButton.~CheckButton">~CheckButton()</A></H4> + +<P>The destructor destroys the widget and frees all memory that has been +allocated. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/FileBrowser.cxx b/SrcUnix/espws-2.0/FileBrowser.cxx new file mode 100644 index 0000000..a5292e7 --- /dev/null +++ b/SrcUnix/espws-2.0/FileBrowser.cxx @@ -0,0 +1,518 @@ +// +// "$Id: FileBrowser.cxx,v 1.20 2000/03/14 15:33:36 mike Exp $" +// +// FileBrowser routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// FileBrowser::item_width() - Return the width of a list item. +// FileBrowser::item_draw() - Draw a list item. +// FileBrowser::FileBrowser() - Create a FileBrowser widget. +// FileBrowser::load() - Load a directory into the browser. +// FileBrowser::filter() - Set the filename filter. +// + +// +// Include necessary header files... +// + +#include "FileBrowser.h" +#include <FL/fl_draw.H> +#include <FL/filename.H> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#if defined(WIN32) +# include <windows.h> +# include <direct.h> +#endif /* WIN32 */ + +#if defined(__EMX__) +#define INCL_DOS +#define INCL_DOSMISC +#include <os2.h> +#endif /* __EMX__ */ + + +// +// FL_BLINE definition from "Fl_Browser.cxx"... +// + +#define SELECTED 1 +#define NOTDISPLAYED 2 + +struct FL_BLINE // data is in a linked list of these +{ + FL_BLINE *prev; // Previous item in list + FL_BLINE *next; // Next item in list + void *data; // Pointer to data (function) + short length; // sizeof(txt)-1, may be longer than string + char flags; // selected, displayed + char txt[1]; // start of allocated array +}; + + +// +// 'FileBrowser::item_height()' - Return the height of a list item. +// + +int // O - Height in pixels +FileBrowser::item_height(void *p) const // I - List item data +{ + FL_BLINE *line; // Pointer to line + char *text; // Pointer into text + int height; // Width of line + int textheight; // Height of text + + + // Figure out the standard text height... + fl_font(textfont(), textsize()); + textheight = fl_height(); + + // We always have at least 1 line... + height = textheight; + + // Scan for newlines... + line = (FL_BLINE *)p; + + if (line != NULL) + for (text = line->txt; *text != '\0'; text ++) + if (*text == '\n') + height += textheight; + + // If we have enabled icons then add space for them... + if (FileIcon::first() != NULL && height < iconsize_) + height = iconsize_; + + // Add space for the selection border.. + height += 2; + + // Return the height + return (height); +} + + +// +// 'FileBrowser::item_width()' - Return the width of a list item. +// + +int // O - Width in pixels +FileBrowser::item_width(void *p) const // I - List item data +{ + int i; // Looping var + FL_BLINE *line; // Pointer to line + char *text, // Pointer into text + *ptr, // Pointer into fragment + fragment[10240]; // Fragment of text + int width, // Width of line + tempwidth; // Width of fragment + int column; // Current column + const int *columns; // Columns + + + // Set the font and size... + fl_font(textfont(), textsize()); + + // Scan for newlines... + line = (FL_BLINE *)p; + columns = column_widths(); + + if (strchr(line->txt, '\n') == NULL && + strchr(line->txt, column_char()) == NULL) + { + // Do a fast width calculation... + width = (int)fl_width(line->txt); + } + else + { + // More than 1 line or have columns; find the maximum width... + width = 0; + tempwidth = 0; + column = 0; + + for (text = line->txt, ptr = fragment; *text != '\0'; text ++) + if (*text == '\n') + { + // Newline - nul terminate this fragment and get the width... + *ptr = '\0'; + + tempwidth += (int)fl_width(fragment); + + // Update the max width as needed... + if (tempwidth > width) + width = tempwidth; + + // Point back to the start of the fragment... + ptr = fragment; + tempwidth = 0; + } + else if (*text == column_char()) + { + // Advance to the next column... + column ++; + if (columns) + { + for (i = 0, tempwidth = 0; i < column && columns[i]; i ++) + tempwidth += columns[column - 1]; + } + else + tempwidth = column * (int)fl_width(" "); + + if (tempwidth > width) + width = tempwidth; + + ptr = fragment; + } + else + *ptr++ = *text; + + if (ptr > fragment) + { + // Nul terminate this fragment and get the width... + *ptr = '\0'; + + tempwidth += (int)fl_width(fragment); + + // Update the max width as needed... + if (tempwidth > width) + width = tempwidth; + } + } + + // If we have enabled icons then add space for them... + if (FileIcon::first() != NULL) + width += iconsize_ + 8; + + // Add space for the selection border.. + width += 2; + + // Return the width + return (width); +} + + +// +// 'FileBrowser::item_draw()' - Draw a list item. +// + +void +FileBrowser::item_draw(void *p, // I - List item data + int x, // I - Upper-lefthand X coordinate + int y, // I - Upper-lefthand Y coordinate + int w, // I - Width of item + int h) const // I - Height of item +{ + int i; // Looping var + FL_BLINE *line; // Pointer to line + Fl_Color c; // Text color + char *text, // Pointer into text + *ptr, // Pointer into fragment + fragment[10240]; // Fragment of text + int width, // Width of line + height; // Height of line + int column; // Current column + const int *columns; // Columns + + + // Draw the list item text... + line = (FL_BLINE *)p; + + fl_font(textfont(), textsize()); + + if (line->flags & SELECTED) + c = fl_contrast(textcolor(), selection_color()); + else + c = textcolor(); + + if (FileIcon::first() == NULL) + { + // No icons, just draw the text... + x ++; + w -= 2; + } + else + { + // Draw the icon if it is set... + if (line->data) + ((FileIcon *)line->data)->draw(x, y, iconsize_, iconsize_, + (line->flags & SELECTED) ? FL_YELLOW : + FL_LIGHT2, + active_r()); + + // Draw the text offset to the right... + x += iconsize_ + 9; + w -= iconsize_ - 10; + + // Center the text vertically... + line = (FL_BLINE *)p; + height = fl_height(); + + for (text = line->txt; *text != '\0'; text ++) + if (*text == '\n') + height += fl_height(); + + if (height < iconsize_) + y += (iconsize_ - height) / 2; + } + + // Draw the text... + line = (FL_BLINE *)p; + columns = column_widths(); + width = 0; + column = 0; + + if (active_r()) + fl_color(c); + else + fl_color(fl_inactive(c)); + + for (text = line->txt, ptr = fragment; *text != '\0'; text ++) + if (*text == '\n') + { + // Newline - nul terminate this fragment and draw it... + *ptr = '\0'; + + fl_draw(fragment, x + width, y, w - width, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); + + // Point back to the start of the fragment... + ptr = fragment; + width = 0; + y += fl_height(); + } + else if (*text == column_char()) + { + // Tab - nul terminate this fragment and draw it... + *ptr = '\0'; + + fl_draw(fragment, x + width, y, w - width, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); + + // Advance to the next column... + column ++; + if (columns) + { + for (i = 0, width = 0; i < column && columns[i]; i ++) + width += columns[column - 1]; + } + else + width = column * (int)fl_width(" "); + + ptr = fragment; + } + else + *ptr++ = *text; + + if (ptr > fragment) + { + // Nul terminate this fragment and draw it... + *ptr = '\0'; + + fl_draw(fragment, x + width, y, w - width, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); + } +} + + +// +// 'FileBrowser::FileBrowser()' - Create a FileBrowser widget. +// + +FileBrowser::FileBrowser(int x, // I - Upper-lefthand X coordinate + int y, // I - Upper-lefthand Y coordinate + int w, // I - Width in pixels + int h, // I - Height in pixels + const char *l) // I - Label text + : Fl_Browser(x, y, w, h, l) +{ + // Initialize the filter pattern, current directory, and icon size... + pattern_ = "*"; + directory_ = ""; + iconsize_ = 3 * textsize() / 2; +} + + +// +// 'FileBrowser::load()' - Load a directory into the browser. +// + +int // O - Number of files loaded +FileBrowser::load(const char *directory)// I - Directory to load +{ + int i; // Looping var + int num_files; // Number of files in directory + char filename[4096]; // Current file + FileIcon *icon; // Icon to use + + + clear(); + directory_ = directory; + + if (directory_[0] == '\0') + { + // + // No directory specified; for UNIX list all mount points. For DOS + // list all valid drive letters... + // + + num_files = 0; + icon = FileIcon::find("any", FileIcon::DEVICE); + +#if defined(WIN32) || defined(__EMX__) + DWORD drives; // Drive available bits + + + drives = GetLogicalDrives(); + for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:", i); + + if (i < 'C') + add(filename, icon); + else + add(filename, icon); + + num_files ++; + } +#elif defined(__EMX__) + ULONG curdrive; // Current drive + ULONG drives; // Drive available bits + int start = 3; // 'C' (MRS - dunno if this is correct!) + + + DosQueryCurrentDisk(&curdrive, &drives); + drives >>= start - 1; + for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:", i); + add(filename, icon); + + num_files ++; + } +#else + FILE *mtab; // /etc/mtab or /etc/mnttab file + char line[1024]; // Input line + + + // + // Open the file that contains a list of mounted filesystems... + // +# if defined(hpux) || defined(__sun) + mtab = fopen("/etc/mnttab", "r"); // Fairly standard +# elif defined(__sgi) || defined(linux) + mtab = fopen("/etc/mtab", "r"); // More standard +# else + mtab = fopen("/etc/fstab", "r"); // Otherwise fallback to full list + if (mtab == NULL) + mtab = fopen("/etc/vfstab", "r"); +# endif + + if (mtab != NULL) + { + while (fgets(line, sizeof(line), mtab) != NULL) + { + if (line[0] == '#' || line[0] == '\n') + continue; + if (sscanf(line, "%*s%4095s", filename) != 1) + continue; + + add(filename, icon); + num_files ++; + } + + fclose(mtab); + } +#endif // WIN32 || __EMX__ + } + else + { + dirent **files; // Files in in directory + + + // + // Build the file list... + // + +#if defined(WIN32) || defined(__EMX__) + strncpy(filename, directory_, sizeof(filename) - 1); + filename[sizeof(filename) - 1] = '\0'; + i = strlen(filename) - 1; + + if (i == 2 && filename[1] == ':' && + (filename[2] == '/' || filename[2] == '\\')) + filename[2] = '/'; + else if (filename[i] != '/' && filename[i] != '\\') + strcat(filename, "/"); + + num_files = filename_list(filename, &files); +#else + num_files = filename_list(directory_, &files); +#endif /* WIN32 || __EMX__ */ + + if (num_files <= 0) + return (0); + + for (i = 0; i < num_files; i ++) + { + if (strcmp(files[i]->d_name, ".") != 0 && + strcmp(files[i]->d_name, "..") != 0) + { + sprintf(filename, "%s/%s", directory_, files[i]->d_name); + + if (filename_isdir(filename) || + filename_match(files[i]->d_name, pattern_)) + add(files[i]->d_name, FileIcon::find(filename)); + } + + free(files[i]); + } + + free(files); + } + + return (num_files); +} + + +// +// 'FileBrowser::filter()' - Set the filename filter. +// + +void +FileBrowser::filter(const char *pattern) // I - Pattern string +{ + // If pattern is NULL set the pattern to "*"... + if (pattern) + pattern_ = pattern; + else + pattern_ = "*"; + + // Reload the current directory... + load(directory_); +} + + +// +// End of "$Id: FileBrowser.cxx,v 1.20 2000/03/14 15:33:36 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileBrowser.h b/SrcUnix/espws-2.0/FileBrowser.h new file mode 100644 index 0000000..ae09d96 --- /dev/null +++ b/SrcUnix/espws-2.0/FileBrowser.h @@ -0,0 +1,71 @@ +// +// "$Id: FileBrowser.h,v 1.10 2000/01/04 13:45:51 mike Exp $" +// +// FileBrowser definitions. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// + +// +// Include necessary header files... +// + +#ifndef _GUI_FILEBROWSER_H_ +# define _GUI_FILEBROWSER_H_ + +# include <FL/Fl_Browser.H> +# include "FileIcon.h" + + +// +// FileBrowser class... +// + +class FileBrowser : public Fl_Browser +{ + const char *directory_; + uchar iconsize_; + const char *pattern_; + + int item_height(void *) const; + int item_width(void *) const; + void item_draw(void *, int, int, int, int) const; + int incr_height() const { return (item_height(0)); } + +public: + FileBrowser(int, int, int, int, const char * = 0); + + uchar iconsize() const { return (iconsize_); }; + void iconsize(uchar s) { iconsize_ = s; redraw(); }; + + void filter(const char *pattern); + const char *filter() const { return (pattern_); }; + + int load(const char *directory); + + uchar textsize() const { return (Fl_Browser::textsize()); }; + void textsize(uchar s) { Fl_Browser::textsize(s); iconsize_ = 3 * s / 2; }; + +}; + +#endif // !_GUI_FILEBROWSER_H_ + +// +// End of "$Id: FileBrowser.h,v 1.10 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileBrowser.html b/SrcUnix/espws-2.0/FileBrowser.html new file mode 100644 index 0000000..4a02032 --- /dev/null +++ b/SrcUnix/espws-2.0/FileBrowser.html @@ -0,0 +1,79 @@ +<HTML> +<HEAD> + <TITLE>FileBrowser - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class FileBrowser</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Browser + | + +----<B>FileBrowser</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "FileBrowser.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>FileBrowser</CODE> widget displays a list of filenames, +optionally with file-specific icons. + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#FileBrowser.FileBrowser">FileBrowser</A> + <LI><A HREF="#FileBrowser.~FileBrowser">~FileBrowser</A> + <LI><A HREF="#FileBrowser.iconsize">iconsize</A> + <LI><A HREF="#FileBrowser.filter">filter</A> + <LI><A HREF="#FileBrowser.load">load</A> + +</UL> + +<H4><A NAME="FileBrowser.FileBrowser">FileBrowser(int xx, int yy, int ww, int hh, const char *l = 0)</A></H4> + +<P>The constructor creates the <CODE>FileBrowser</CODE> widget at the specified +position and size. + +<H4><A NAME="FileBrowser.~FileBrowser">~FileBrowser()</A></H4> + +<P>The destructor destroys the widget and frees all memory that has been +allocated. + +<H4><A NAME="FileBrowser.iconsize">void iconsize(uchar s)<BR> +uchar iconsize() const</A></H4> + +<P>Sets or gets the size of the icons. The default size is 20 pixels. + +<H4><A NAME="FileBrowser.filter">void filter(const char *pattern)<BR> +const char *filter() const</A></H4> + +<P>Sets or gets the filename filter. The pattern matching uses the +<CODE>filename_match()</CODE> function in FLTK. + +<H4><A NAME="FileBrowser.load">int load(const char *directory)</A></H4> + +<P>Loads the specified directory into the browser. If icons have been +loaded then the correct icon is associated with each file in the list. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/FileChooser.cxx b/SrcUnix/espws-2.0/FileChooser.cxx new file mode 100644 index 0000000..64bfd04 --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser.cxx @@ -0,0 +1,249 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#include "FileChooser.h" + +inline void FileChooser::cb_window_i(Fl_Window*, void*) { + fileList->deselect(); +fileName->value(""); +window->hide(); +} +void FileChooser::cb_window(Fl_Window* o, void* v) { + ((FileChooser*)(o->user_data()))->cb_window_i(o,v); +} + +inline void FileChooser::cb_fileList_i(FileBrowser*, void*) { + fileListCB(); +} +void FileChooser::cb_fileList(FileBrowser* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_fileList_i(o,v); +} + +inline void FileChooser::cb_Cancel_i(Fl_Button*, void*) { + fileList->deselect(); +fileName->value(""); +window->hide(); +} +void FileChooser::cb_Cancel(Fl_Button* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_Cancel_i(o,v); +} + +inline void FileChooser::cb_okButton_i(Fl_Return_Button*, void*) { + window->hide(); +} +void FileChooser::cb_okButton(Fl_Return_Button* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_okButton_i(o,v); +} + +inline void FileChooser::cb_fileName_i(FileInput*, void*) { + fileNameCB(); +} +void FileChooser::cb_fileName(FileInput* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_fileName_i(o,v); +} + +inline void FileChooser::cb_upButton_i(Fl_Button*, void*) { + up(); +} +void FileChooser::cb_upButton(Fl_Button* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_upButton_i(o,v); +} + +#include <FL/Fl_Bitmap.H> +static unsigned char bits_up[] = +"\0\0x\0\204\0\2\1""1\376y\200\375\200""1\200""1\200""1\200""1\200""1\200\1\ +\200\1\200\377\377\0\0"; +static Fl_Bitmap bitmap_up(bits_up, 16, 16); + +inline void FileChooser::cb_newButton_i(Fl_Button*, void*) { + newdir(); +} +void FileChooser::cb_newButton(Fl_Button* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_newButton_i(o,v); +} + +static unsigned char bits_new[] = +"\0\0x\0\204\0\2\1\1\376\1\200""1\200""1\200\375\200\375\200""1\200""1\200\1\ +\200\1\200\377\377\0\0"; +static Fl_Bitmap bitmap_new(bits_new, 16, 16); + +inline void FileChooser::cb_dirMenu_i(Fl_Choice*, void*) { + char pathname[1024]; +int i; + +pathname[0] = '\0'; +for (i = 1; i <= dirMenu->value(); i ++) + strcat(pathname, dirMenu->text(i)); +directory(pathname); +} +void FileChooser::cb_dirMenu(Fl_Choice* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_dirMenu_i(o,v); +} + +inline void FileChooser::cb_allfiles_i(Fl_Button*, void*) { + fileList->filter("*");; +rescan(); +} +void FileChooser::cb_allfiles(Fl_Button* o, void* v) { + ((FileChooser*)(o->parent()->user_data()))->cb_allfiles_i(o,v); +} + +static unsigned char bits_allfiles[] = +"\374?\4 \4 \4 \204!\244%\304#\364/\364/\304#\244%\204!\4 \4 \4 \374?"; +static Fl_Bitmap bitmap_allfiles(bits_allfiles, 16, 16); + +FileChooser::FileChooser(const char *d, const char *p, int t, const char *title) { + Fl_Window* w; + { Fl_Window* o = window = new Fl_Window(375, 315, "Pick a File"); + w = o; + o->callback((Fl_Callback*)cb_window, (void*)(this)); + w->hotspot(o); + { FileBrowser* o = fileList = new FileBrowser(10, 45, 355, 180); + o->type(2); + o->callback((Fl_Callback*)cb_fileList); + Fl_Group::current()->resizable(o); + w->hotspot(o); + } + { Fl_Button* o = new Fl_Button(300, 280, 65, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel); + } + { Fl_Return_Button* o = okButton = new Fl_Return_Button(240, 280, 55, 25, "OK"); + o->callback((Fl_Callback*)cb_okButton); + } + { FileInput* o = fileName = new FileInput(10, 245, 355, 25, "Filename:"); + o->callback((Fl_Callback*)cb_fileName); + o->align(FL_ALIGN_TOP_LEFT); + o->when(FL_WHEN_ENTER_KEY); + fileName->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); + } + { Fl_Button* o = upButton = new Fl_Button(280, 10, 25, 25); + bitmap_up.label(o); + o->labelsize(8); + o->callback((Fl_Callback*)cb_upButton); + } + { Fl_Button* o = newButton = new Fl_Button(310, 10, 25, 25); + bitmap_new.label(o); + o->labelsize(8); + o->callback((Fl_Callback*)cb_newButton); + } + { Fl_Choice* o = dirMenu = new Fl_Choice(75, 10, 200, 25, "Directory:"); + o->callback((Fl_Callback*)cb_dirMenu); + } + { Fl_Button* o = allFiles = new Fl_Button(340, 10, 25, 25); + bitmap_allfiles.label(o); + o->labelsize(28); + o->labelcolor(4); + o->callback((Fl_Callback*)cb_allfiles); + o->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + } + if (title) window->label(title); + o->set_modal(); + o->end(); + } + window->size_range(345, 270, 345); +directory_chooser_ = false; +fileList->filter(p); +type(t); +value(d); +} + +void FileChooser::color(Fl_Color c) { + fileList->color(c); +} + +Fl_Color FileChooser::color() { + return (fileList->color()); +} + +char * FileChooser::directory() { + return directory_; +} + +void FileChooser::filter(const char *p) { + fileList->filter(p); +rescan(); +} + +const char * FileChooser::filter() { + return (fileList->filter()); +} + +void FileChooser::hide() { + window->hide(); +} + +void FileChooser::iconsize(uchar s) { + fileList->iconsize(s); +} + +uchar FileChooser::iconsize() { + return (fileList->iconsize()); +} + +void FileChooser::label(const char *l) { + window->label(l); +} + +const char * FileChooser::label() { + return (window->label()); +} + +void FileChooser::show() { + window->show(); +fileList->deselect(); +} + +void FileChooser::textcolor(Fl_Color c) { + fileList->textcolor(c); +} + +Fl_Color FileChooser::textcolor() { + return (fileList->textcolor()); +} + +void FileChooser::textfont(uchar f) { + fileList->textfont(f); +} + +uchar FileChooser::textfont() { + return (fileList->textfont()); +} + +void FileChooser::textsize(uchar s) { + fileList->textsize(s); +} + +uchar FileChooser::textsize() { + return (fileList->textsize()); +} + +void FileChooser::type(int t) { + if (t == DIRECTORY) + { + t = SINGLE; + directory_chooser_ = true; + allFiles->deactivate(); + fileList->filter("-_-_-_-_-_-"); /* Match that! */ + } + + type_ = t; +if (t == MULTI) + fileList->type(FL_MULTI_BROWSER); +else + fileList->type(FL_HOLD_BROWSER); +if (t != CREATE) + newButton->deactivate(); +else + newButton->activate(); +} + +int FileChooser::type() { + return (type_); +} + +int FileChooser::visible() { + return window->visible(); +} + +int FileChooser::shown() { + return window->shown(); +} diff --git a/SrcUnix/espws-2.0/FileChooser.fl b/SrcUnix/espws-2.0/FileChooser.fl new file mode 100644 index 0000000..da2b12a --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser.fl @@ -0,0 +1,189 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.00 +header_name {.h} +code_name {.cxx} +gridx 5 +gridy 5 +snap 3 +class FileChooser {open +} { + decl {enum { SINGLE, MULTI, CREATE };} {public + } + Function {FileChooser(const char *d, const char *p, int t, const char *title)} {open + } { + Fl_Window window { + label {Pick a File} + callback {fileList->deselect(); +fileName->value(""); +window->hide();} open + private xywh {173 142 375 315} resizable hotspot + code0 {if (title) window->label(title);} + code1 {\#include <stdio.h>} + code2 {\#include <stdlib.h>} + code3 {\#include <string.h>} modal visible + } { + Fl_Browser fileList { + callback {fileListCB();} selected + private xywh {10 45 355 180} type Hold resizable hotspot + code1 {\#include "FileBrowser.h"} + class FileBrowser + } + Fl_Button {} { + label Cancel + callback {fileList->deselect(); +fileName->value(""); +window->hide();} + private xywh {300 280 65 25} + } + Fl_Return_Button okButton { + label OK + callback {window->hide();} + private xywh {240 280 55 25} + } + Fl_Input fileName { + label {Filename:} + callback {fileNameCB();} + private xywh {10 245 355 25} align 5 when 8 + code0 {fileName->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS);} + code1 {\#include "FileInput.h"} + class FileInput + } + Fl_Button upButton { + label {up.xbm} + callback {up();} + private xywh {280 10 25 25} labeltype image labelsize 8 + } + Fl_Button newButton { + label {new.xbm} + callback {newdir();} + private xywh {310 10 25 25} labeltype image labelsize 8 + } + Fl_Choice dirMenu { + label {Directory:} + callback {char pathname[1024]; +int i; + +pathname[0] = '\\0'; +for (i = 1; i <= dirMenu->value(); i ++) + strcat(pathname, dirMenu->text(i)); +directory(pathname);} open + private xywh {75 10 200 25} + } {} + Fl_Button {} { + label {allfiles.xbm} + callback {fileList->filter("*");; +rescan();} + private xywh {340 10 25 25} labeltype image labelsize 28 labelcolor 4 align 16 + } + } + code {window->size_range(345, 270, 345); +fileList->filter(p); +type(t); +value(d);} {} + } + decl {char directory_[1024];} {} + decl {int type_;} {} + decl {void fileListCB();} {} + decl {void fileNameCB();} {} + decl {void newdir();} {} + decl {void up();} {} + Function {color(Fl_Color c)} {} { + code {fileList->color(c);} {} + } + Function {color()} {return_type Fl_Color + } { + code {return (fileList->color());} {} + } + decl {int count();} {public + } + decl {void directory(const char *d);} {public + } + Function {directory()} {return_type {char *} + } { + code {return directory_;} {} + } + Function {filter(const char *p)} {return_type void + } { + code {fileList->filter(p); +rescan();} {} + } + Function {filter()} {return_type {const char *} + } { + code {return (fileList->filter());} {} + } + Function {hide()} {return_type void + } { + code {window->hide();} {} + } + Function {iconsize(uchar s)} {return_type void + } { + code {fileList->iconsize(s);} {} + } + Function {iconsize()} {return_type uchar + } { + code {return (fileList->iconsize());} {} + } + Function {label(const char *l)} {return_type void + } { + code {window->label(l);} {} + } + Function {label()} {return_type {const char *} + } { + code {return (window->label());} {} + } + decl {void rescan();} {public + } + Function {show()} {return_type void + } { + code {window->show(); +fileList->deselect();} {} + } + Function {textcolor(Fl_Color c)} {return_type void + } { + code {fileList->textcolor(c);} {} + } + Function {textcolor()} {return_type Fl_Color + } { + code {return (fileList->textcolor());} {} + } + Function {textfont(uchar f)} {return_type void + } { + code {fileList->textfont(f);} {} + } + Function {textfont()} {return_type uchar + } { + code {return (fileList->textfont());} {} + } + Function {textsize(uchar s)} {return_type void + } { + code {fileList->textsize(s);} {} + } + Function {textsize()} {return_type uchar + } { + code {return (fileList->textsize());} {} + } + Function {type(int t)} {return_type void + } { + code {type_ = t; +if (t == MULTI) + fileList->type(FL_MULTI_BROWSER); +else + fileList->type(FL_HOLD_BROWSER); +if (t != CREATE) + newButton->deactivate(); +else + newButton->activate();} {} + } + Function {type()} {return_type int + } { + code {return (type_);} {} + } + decl {const char *value(int f = 1);} {public + } + decl {void value(const char *filename);} {public + } + Function {visible()} {return_type int + } { + code {return window->visible();} {} + } +} diff --git a/SrcUnix/espws-2.0/FileChooser.gif b/SrcUnix/espws-2.0/FileChooser.gif Binary files differnew file mode 100644 index 0000000..5a72f62 --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser.gif diff --git a/SrcUnix/espws-2.0/FileChooser.h b/SrcUnix/espws-2.0/FileChooser.h new file mode 100644 index 0000000..0b5e7f5 --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser.h @@ -0,0 +1,82 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#ifndef FileChooser_h +#define FileChooser_h +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "FileBrowser.h" +#include <FL/Fl_Button.H> +#include <FL/Fl_Return_Button.H> +#include "FileInput.h" +#include <FL/Fl_Choice.H> + +class FileChooser { +public: + enum { SINGLE, MULTI, CREATE, DIRECTORY }; + FileChooser(const char *d, const char *p, int t, const char *title); +private: + Fl_Window *window; + inline void cb_window_i(Fl_Window*, void*); + static void cb_window(Fl_Window*, void*); + FileBrowser *fileList; + inline void cb_fileList_i(FileBrowser*, void*); + static void cb_fileList(FileBrowser*, void*); + inline void cb_Cancel_i(Fl_Button*, void*); + static void cb_Cancel(Fl_Button*, void*); + Fl_Return_Button *okButton; + inline void cb_okButton_i(Fl_Return_Button*, void*); + static void cb_okButton(Fl_Return_Button*, void*); + FileInput *fileName; + inline void cb_fileName_i(FileInput*, void*); + static void cb_fileName(FileInput*, void*); + Fl_Button *upButton; + inline void cb_upButton_i(Fl_Button*, void*); + static void cb_upButton(Fl_Button*, void*); + Fl_Button *newButton; + inline void cb_newButton_i(Fl_Button*, void*); + static void cb_newButton(Fl_Button*, void*); + Fl_Choice *dirMenu; + inline void cb_dirMenu_i(Fl_Choice*, void*); + static void cb_dirMenu(Fl_Choice*, void*); + Fl_Button *allFiles; + inline void cb_allfiles_i(Fl_Button*, void*); + static void cb_allfiles(Fl_Button*, void*); + char directory_[1024]; + int type_; + int directory_chooser_; + void fileListCB(); + void fileNameCB(); + void newdir(); + void up(); +public: + void color(Fl_Color c); + Fl_Color color(); + int count(); + void directory(const char *d); + char * directory(); + void filter(const char *p); + const char * filter(); + void hide(); + void iconsize(uchar s); + uchar iconsize(); + void label(const char *l); + const char * label(); + void rescan(); + void show(); + void textcolor(Fl_Color c); + Fl_Color textcolor(); + void textfont(uchar f); + uchar textfont(); + void textsize(uchar s); + uchar textsize(); + void type(int t); + int type(); + const char *value(int f = 1); + void value(const char *filename); + int visible(); + int shown(); +}; +#endif diff --git a/SrcUnix/espws-2.0/FileChooser.html b/SrcUnix/espws-2.0/FileChooser.html new file mode 100644 index 0000000..6a30107 --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser.html @@ -0,0 +1,172 @@ +<HTML> +<HEAD> + <TITLE>FileChooser - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class FileChooser</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Group + | + +----<B>FileChooser</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "FileChooser.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>FileChooser</CODE> widget displays a standard file selection +dialog that supports various selection modes. + +<CENTER><IMG SRC="FileChooser.gif" WIDTH="397" HEIGHT="322" ALT="FileChooser widget"></CENTER> + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#FileChooser.FileChooser">FileChooser</A> + <LI><A HREF="#FileChooser.~FileChooser">~FileChooser</A> + <LI><A HREF="#FileChooser.color">color</A> + <LI><A HREF="#FileChooser.count">count</A> + <LI><A HREF="#FileChooser.directory">directory</A> + <LI><A HREF="#FileChooser.filter">filter</A> + <LI><A HREF="#FileChooser.hide">hide</A> + <LI><A HREF="#FileChooser.iconsize">iconsize</A> + <LI><A HREF="#FileChooser.label">label</A> + <LI><A HREF="#FileChooser.rescan">rescan</A> + <LI><A HREF="#FileChooser.show">show</A> + <LI><A HREF="#FileChooser.textcolor">textcolor</A> + <LI><A HREF="#FileChooser.textfont">textfont</A> + <LI><A HREF="#FileChooser.textsize">textsize</A> + <LI><A HREF="#FileChooser.type">type</A> + <LI><A HREF="#FileChooser.value">value</A> + <LI><A HREF="#FileChooser.visible">visible</A> + +</UL> + +<H4><A NAME="FileChooser.FileChooser">FileChooser(const char *pathname, const char *pattern, +int type, const char *title)</A></H4> + +<P>The constructor creates the <CODE>FileChooser</CODE> dialog pictured +above. The <CODE>pathname</CODE> argument can be a directory name or a +complete file name (in which case the corresponding file is highlighted +in the list and in the filename input field.) + +<P>The <CODE>pattern</CODE> argument can be a <CODE>NULL</CODE> string or +<CODE>"*"</CODE> to list all files. See the FLTK documentation on +<CODE>filename_match()</CODE> for other kinds of patterns. + +<P>The <CODE>type</CODE> argument can be one of the following: + +<UL> + <LI><CODE>SINGLE</CODE> - allows the user to select a + single, existing file. + <LI><CODE>MULTI</CODE> - allows the user to select one + or more existing files. + <LI><CODE>CREATE</CODE> - allows the user to select a + single, existing file or specify a new filename. +</UL> + +<P>The <CODE>title</CODE> argument is used to set the title bar text for the +<CODE>FileChooser</CODE> window. + +<H4><A NAME="FileChooser.~FileChooser">~FileChooser()</A></H4> + +<P>Destroys the widget and frees all memory used by it. + +<H4><A NAME="FileChooser.color">void color(Fl_Color c)<BR> +Fl_Color color()</A></H4> + +<P>Sets or gets the background color of the <CODE>FileBrowser</CODE> list. + +<H4><A NAME="FileChooser.count">int count()</A></H4> + +<P>Returns the number of selected files. + +<H4><A NAME="FileChooser.directory">void directory(const char *pathname)<BR> +const char *directory()</A></H4> + +<P>Sets or gets the current directory. + +<H4><A NAME="FileChooser.filter">void filter(const char *pattern)<BR> +const char *filter()</A></H4> + +<P>Sets or gets the current filename filter pattern. + +<H4><A NAME="FileChooser.hide">void hide()</A></H4> + +<P>Hides the <CODE>FileChooser</CODE> window. + +<H4><A NAME="FileChooser.iconsize">void iconsize(uchar s)<BR> +uchar iconsize()</A></H4> + +<P>Sets or gets the size of the icons in the <CODE>FileBrowser</CODE>. By +default the icon size is set to 1.5 times the <CODE>textsize()</CODE>. + +<H4><A NAME="FileChooser.label">void label(const char *l)<BR> +const char *label()</A></H4> + +<P>Sets or gets the title bar text for the <CODE>FileChooser</CODE>. + +<H4><A NAME="FileChooser.rescan">void rescan()</A></H4> + +<P>Reloads the current directory in the <CODE>FileBrowser</CODE>. + +<H4><A NAME="FileChooser.show">void show()</A></H4> + +<P>Shows the <CODE>FileChooser</CODE> window. + +<H4><A NAME="FileChooser.textcolor">void textcolor(Fl_Color c)<BR> +Fl_Color textcolor()</A></H4> + +<P>Sets or gets the current <CODE>FileBrowser</CODE> text color. + +<H4><A NAME="FileChooser.textfont">void textfont(uchar f)<BR> +uchar textfont()</A></H4> + +<P>Sets or gets the current <CODE>FileBrowser</CODE> text font. + +<H4><A NAME="FileChooser.textsize">void textsize(uchar s)<BR> +uchar textsize()</A></H4> + +<P>Sets or gets the current <CODE>FileBrowser</CODE> text size. + +<H4><A NAME="FileChooser.type">void type(int t)<BR> +int type()</A></H4> + +<P>Sets or gets the current type of <CODE>FileChooser</CODE>. + +<H4><A NAME="FileChooser.value">const char *value(const char *pathname)<BR> +const char *value(int file)<BR> +const char *value()</A></H4> + +<P>Sets or gets the current value of the selected file. + +<H4><A NAME="FileChooser.visible">int visible()</A></H4> + +<P>Returns 1 if the <CODE>FileChooser</CODE> window is visible. + +<HR> + + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/FileChooser2.cxx b/SrcUnix/espws-2.0/FileChooser2.cxx new file mode 100644 index 0000000..b77a35c --- /dev/null +++ b/SrcUnix/espws-2.0/FileChooser2.cxx @@ -0,0 +1,645 @@ +// +// "$Id: FileChooser2.cxx,v 1.22 2000/01/04 13:45:51 mike Exp $" +// +// More FileChooser routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// FileChooser::directory() - Set the directory in the file chooser. +// FileChooser::count() - Return the number of selected files. +// FileChooser::value() - Return a selected filename. +// FileChooser::up() - Go up one directory. +// FileChooser::newdir() - Make a new directory. +// FileChooser::rescan() - Rescan the current directory. +// FileChooser::fileListCB() - Handle clicks (and double-clicks) in the +// FileBrowser. +// FileChooser::fileNameCB() - Handle text entry in the FileBrowser. +// + +// +// Include necessary headers. +// + +#include "FileChooser.h" +#include <FL/filename.H> +#include <FL/fl_ask.H> +#include <FL/x.H> + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <string.h> + +#if defined(WIN32) || defined(__EMX__) +# include <direct.h> +# include <io.h> +#else +# include <unistd.h> +#endif /* WIN32 || __EMX__ */ + + +// +// 'FileChooser::directory()' - Set the directory in the file chooser. +// + +void +FileChooser::directory(const char *d) // I - Directory to change to +{ + char pathname[1024], // Full path of directory + *pathptr, // Pointer into full path + *dirptr; // Pointer into directory + int levels; // Number of levels in directory + + + // NULL == current directory + if (d == NULL) + d = "."; + + if (d[0] != '\0') + { + // Make the directory absolute... +#if defined(WIN32) || defined(__EMX__) + if (d[0] != '/' && d[0] != '\\' && d[1] != ':') +#else + if (d[0] != '/' && d[0] != '\\') +#endif /* WIN32 || __EMX__ */ + filename_absolute(directory_, d); + else + { + strncpy(directory_, d, sizeof(directory_) - 1); + directory_[sizeof(directory_) - 1] = '\0'; + } + + // Strip any trailing slash and/or period... + dirptr = directory_ + strlen(directory_) - 1; + if (*dirptr == '.') + *dirptr-- = '\0'; + if ((*dirptr == '/' || *dirptr == '\\') && dirptr > directory_) + *dirptr = '\0'; + } + else + directory_[0] = '\0'; + + // Clear the directory menu and fill it as needed... + dirMenu->clear(); +#if defined(WIN32) || defined(__EMX__) + dirMenu->add("My Computer"); +#else + dirMenu->add("File Systems"); +#endif /* WIN32 || __EMX__ */ + + levels = 0; + for (dirptr = directory_, pathptr = pathname; *dirptr != '\0';) + { + if (*dirptr == '/' || *dirptr == '\\') + { + // Need to quote the slash first, and then add it to the menu... + *pathptr++ = '\\'; + *pathptr++ = '/'; + *pathptr++ = '\0'; + dirptr ++; + + dirMenu->add(pathname); + levels ++; + pathptr = pathname; + } + else + *pathptr++ = *dirptr++; + } + + if (pathptr > pathname) + { + *pathptr = '\0'; + dirMenu->add(pathname); + levels ++; + } + + dirMenu->value(levels); + + // Rescan the directory... + rescan(); +} + + +// +// 'FileChooser::count()' - Return the number of selected files. +// + +int // O - Number of selected files +FileChooser::count() +{ + int i; // Looping var + int count; // Number of selected files + const char *filename; // Filename in input field or list + char pathname[1024]; // Full path to file + + + if (type_ != MULTI) + { + // Check to see if the file name input field is blank... + filename = fileName->value(); + if (filename == NULL || filename[0] == '\0') + return (0); + + // Is the file name a directory? + if (directory_[0] != '\0') + sprintf(pathname, "%s/%s", directory_, filename); + else + { + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } + + if (filename_isdir(pathname) && !directory_chooser_) + return (0); + else + return (1); + } + + for (i = 1, count = 0; i <= fileList->size(); i ++) + if (fileList->selected(i)) + { + // See if this file is a directory... + filename = (char *)fileList->text(i); + if (directory_[0] != '\0') + sprintf(pathname, "%s/%s", directory_, filename); + else + { + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } + + if (!filename_isdir(pathname) || directory_chooser_) + count ++; + } + + return (count); +} + + +// +// 'FileChooser::value()' - Return a selected filename. +// + +const char * // O - Filename or NULL +FileChooser::value(int f) // I - File number +{ + int i; // Looping var + int count; // Number of selected files + const char *name; // Current filename + static char pathname[1024]; // Filename + directory + +// There seems to be a little bit of a bug...sometimes +// the returned path can start with '//'. I think the +// Unix file system handles this OK ("ls //tmp" works), +// but lets clean it up anyway. + + if (strlen (directory_) >= 2 && + directory_[0] == '/' && directory_[1] == '/') + { + memmove (directory_, directory_ + 1, strlen (directory_)); + } + + if (type_ != MULTI) + { + name = fileName->value(); + if (name[0] == '\0') + return (NULL); + + sprintf(pathname, "%s/%s", directory_, name); + return ((const char *)pathname); + } + + for (i = 1, count = 0; i <= fileList->size(); i ++) + if (fileList->selected(i)) + { + // See if this file is a directory... + name = fileList->text(i); + sprintf(pathname, "%s/%s", directory_, name); + + if (!filename_isdir(pathname) || directory_chooser_) + { + // Nope, see if this this is "the one"... + count ++; + if (count == f) + return ((const char *)pathname); + } + } + + return (NULL); +} + + +// +// 'FileChooser::value()' - Set the current filename. +// + +void +FileChooser::value(const char *filename) // I - Filename + directory +{ + int i, // Looping var + count; // Number of items in list + char *slash; // Directory separator + char pathname[1024]; // Local copy of filename + + + // See if the filename is actually a directory... + if (filename == NULL || filename_isdir(filename)) + { + // Yes, just change the current directory... + directory(filename); + return; + } + + // Switch to single-selection mode as needed + if (type_ == MULTI) + type(SINGLE); + + // See if there is a directory in there... + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + + if ((slash = strrchr(pathname, '/')) == NULL) + slash = strrchr(pathname, '\\'); + + if (slash != NULL) + { + // Yes, change the display to the directory... + *slash++ = '\0'; + directory(pathname); + } + else + slash = pathname; + + // Set the input field to the remaining portion + fileName->value(slash); + fileName->position(0, strlen(slash)); + okButton->activate(); + + // Then find the file in the file list and select it... + count = fileList->size(); + + for (i = 1; i <= count; i ++) + if (strcmp(fileList->text(i), slash) == 0) + { + fileList->select(i); + break; + } +} + + +// +// 'FileChooser::up()' - Go up one directory. +// + +void +FileChooser::up() +{ + char *slash; // Trailing slash + + + if ((slash = strrchr(directory_, '/')) == NULL) + slash = strrchr(directory_, '\\'); + + if (directory_[0] != '\0') + dirMenu->value(dirMenu->value() - 1); + + if (slash != NULL) + *slash = '\0'; + else + { + upButton->deactivate(); + directory_[0] = '\0'; + } + + rescan(); +} + + +// +// 'FileChooser::newdir()' - Make a new directory. +// + +void +FileChooser::newdir() +{ + const char *dir; // New directory name + char pathname[1024]; // Full path of directory + + + // Get a directory name from the user + if ((dir = fl_input("New Directory?", NULL)) == NULL) + return; + + // Make it relative to the current directory as needed... +#if defined(WIN32) || defined(__EMX__) + if (dir[0] != '/' && dir[0] != '\\' && dir[1] != ':') +#else + if (dir[0] != '/' && dir[0] != '\\') +#endif /* WIN32 || __EMX__ */ + sprintf(pathname, "%s/%s", directory_, dir); + else + { + strncpy(pathname, dir, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } + + // Create the directory; ignore EEXIST errors... +#if defined(WIN32) || defined(__EMX__) + if (mkdir(pathname)) +#else + if (mkdir(pathname, 0777)) +#endif /* WIN32 || __EMX__ */ + if (errno != EEXIST) + { + fl_alert("Unable to create directory!"); + return; + } + + // Show the new directory... + directory(pathname); +} + + +// +// 'FileChooser::rescan()' - Rescan the current directory. +// + +void +FileChooser::rescan() +{ + // Clear the current filename + fileName->value(""); + okButton->deactivate(); + + // Build the file list... + fileList->load(directory_); +} + + +// +// 'FileChooser::fileListCB()' - Handle clicks (and double-clicks) in the +// FileBrowser. +// + +void +FileChooser::fileListCB() +{ + char *filename, // New filename + pathname[1024]; // Full pathname to file + + + filename = (char *)fileList->text(fileList->value()); + if (directory_[0] != '\0') + sprintf(pathname, "%s/%s", directory_, filename); + else + { + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } + + if (Fl::event_clicks()) + { +#if defined(WIN32) || defined(__EMX__) + if ((strlen(pathname) == 2 && pathname[1] == ':') || + filename_isdir(pathname)) +#else + if (filename_isdir(pathname)) +#endif /* WIN32 || __EMX__ */ + { + directory(pathname); + upButton->activate(); + } + else + window->hide(); + } + else + { + fileName->value(filename); + + if (!filename_isdir(pathname) || directory_chooser_) + okButton->activate(); + } +} + + +// +// 'FileChooser::fileNameCB()' - Handle text entry in the FileBrowser. +// + +void +FileChooser::fileNameCB() +{ + char *filename, // New filename + *slash, // Pointer to trailing slash + pathname[1024]; // Full pathname to file + int i, // Looping var + min_match, // Minimum number of matching chars + max_match, // Maximum number of matching chars + num_files, // Number of files in directory + first_line; // First matching line + const char *file; // File from directory + + + // Get the filename from the text field... + filename = (char *)fileName->value(); + + if (filename == NULL || filename[0] == '\0') + { + okButton->deactivate(); + return; + } + +#if defined(WIN32) || defined(__EMX__) + if (directory_[0] != '\0' && + filename[0] != '/' && + filename[0] != '\\' && + !(isalpha(filename[0]) && filename[1] == ':')) + sprintf(pathname, "%s/%s", directory_, filename); + else + { + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } +#else + if (directory_[0] != '\0' && + filename[0] != '/') + sprintf(pathname, "%s/%s", directory_, filename); + else + { + strncpy(pathname, filename, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + } +#endif /* WIN32 || __EMX__ */ + + if (Fl::event_key() == FL_Enter) + { + // Enter pressed - select or change directory... + +#if defined(WIN32) || defined(__EMX__) + if (((strlen(pathname) == 2 && pathname[1] == ':') || + filename_isdir(pathname)) && !directory_chooser_) +#else + if (filename_isdir(pathname) && !directory_chooser_) +#endif /* WIN32 || __EMX__ */ + directory(pathname); + else if (type_ == CREATE || access(pathname, 0) == 0) + { + // New file or file exists... If we are in multiple selection mode, + // switch to single selection mode... + if (type_ == MULTI) + type(SINGLE); + + // Hide the window to signal things are done... + window->hide(); + } + else + { + // File doesn't exist, so beep at and alert the user... + // TODO: NEED TO ADD fl_beep() FUNCTION TO 2.0! +#ifdef WIN32 + MessageBeep(MB_ICONEXCLAMATION); +#else + XBell(fl_display, 100); +#endif // WIN32 + + fl_alert("Please choose an existing file!"); + } + } + else if (Fl::event_key() != FL_Delete) + { + // Check to see if the user has entered a directory... + if ((slash = strrchr(filename, '/')) == NULL) + slash = strrchr(filename, '\\'); + + if (slash != NULL) + { + // Yes, change directories and update the file name field... + if ((slash = strrchr(pathname, '/')) == NULL) + slash = strrchr(pathname, '\\'); + + if (slash > pathname) // Special case for "/" + *slash++ = '\0'; + else + slash++; + + if (strcmp(filename, "../") == 0) // Special case for "../" + up(); + else + directory(pathname); + + // If the string ended after the slash, we're done for now... + if (*slash == '\0') + return; + + // Otherwise copy the remainder and proceed... + fileName->value(slash); + fileName->position(strlen(slash)); + filename = slash; + } + + // Other key pressed - do filename completion as possible... + num_files = fileList->size(); + min_match = strlen(filename); + max_match = 100000; + first_line = 0; + + for (i = 1; i <= num_files && max_match > min_match; i ++) + { + file = fileList->text(i); + +#if defined(WIN32) || defined(__EMX__) + if (strnicmp(filename, file, min_match) == 0) +#else + if (strncmp(filename, file, min_match) == 0) +#endif // WIN32 || __EMX__ + { + // OK, this one matches; check against the previous match + if (max_match == 100000) + { + // First match; copy stuff over... + strncpy(pathname, file, sizeof(pathname) - 1); + pathname[sizeof(pathname) - 1] = '\0'; + max_match = strlen(pathname); + + // And then make sure that the item is visible + fileList->topline(i); + first_line = i; + } + else + { + // Succeeding match; compare to find maximum string match... + while (max_match > min_match) +#if defined(WIN32) || defined(__EMX__) + if (strnicmp(file, pathname, max_match) == 0) +#else + if (strncmp(file, pathname, max_match) == 0) +#endif // WIN32 || __EMX__ + break; + else + max_match --; + + // Truncate the string as needed... + pathname[max_match] = '\0'; + } + } + } + + fileList->deselect(0); + fileList->redraw(); + + // If we have any matches, add them to the input field... + if (first_line > 0 && min_match == max_match && + max_match == (int)strlen(fileList->text(first_line))) + fileList->select(first_line); + else if (max_match > min_match && max_match != 100000) + { + // Add the matching portion... + fileName->replace(0, min_match, pathname); + + // Highlight it; if the user just pressed the backspace + // key, position the cursor at the start of the selection. + // Otherwise, put the cursor at the end of the selection so + // s/he can press the right arrow to accept the selection + // (Tab and End also do this for both cases.) + if (Fl::event_key() == FL_BackSpace) + fileName->position(min_match - 1, max_match); + else + fileName->position(max_match, min_match); + } + + // See if we need to enable the OK button... + sprintf(pathname, "%s/%s", directory_, fileName->value()); + + if ((type_ == CREATE || access(pathname, 0) == 0) && + (!filename_isdir(pathname) || directory_chooser_)) + okButton->activate(); + else + okButton->deactivate(); + } +} + + +// +// End of "$Id: FileChooser2.cxx,v 1.22 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileIcon.cxx b/SrcUnix/espws-2.0/FileIcon.cxx new file mode 100644 index 0000000..9eae59a --- /dev/null +++ b/SrcUnix/espws-2.0/FileIcon.cxx @@ -0,0 +1,1217 @@ +// +// "$Id: FileIcon.cxx,v 1.19 2000/01/22 15:21:07 mike Exp $" +// +// FileIcon routines. +// +// KDE icon code donated by Maarten De Boer. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// FileIcon::FileIcon() - Create a new file icon. +// FileIcon::~FileIcon() - Remove a file icon. +// FileIcon::add() - Add data to an icon. +// FileIcon::find() - Find an icon based upon a given file. +// FileIcon::draw() - Draw an icon. +// FileIcon::label() - Set the widgets label to an icon. +// FileIcon::labeltype() - Draw the icon label. +// FileIcon::load() - Load an icon file... +// FileIcon::load_fti() - Load an SGI-format FTI file... +// FileIcon::load_xpm() - Load an XPM icon file... +// FileIcon::load_system_icons() - Load the standard system icons/filetypes. +// + +// +// Include necessary header files... +// + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#if defined(WIN32) || defined(__EMX__) +# include <io.h> +# define F_OK 0 +# define strcasecmp stricmp +# define strncasecmp strnicmp +#else +# include <unistd.h> +#endif /* WIN32 || __EMX__ */ + +#include "FileIcon.h" + +#include <FL/Fl_Widget.H> +#include <FL/fl_draw.H> +#include <FL/filename.H> + + +// +// Define missing POSIX/XPG4 macros as needed... +// + +#ifndef S_ISDIR +# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#endif /* !S_ISDIR */ + + +// +// Icon cache... +// + +FileIcon *FileIcon::first_ = (FileIcon *)0; + + +// +// Local functions... +// + +static void load_kde_icons(const char *directory); +static void load_kde_mimelnk(const char *filename); +static char *kde_to_fltk_pattern(const char *kdepattern); +static char *get_kde_val(char *str, const char *key); + + +// +// 'FileIcon::FileIcon()' - Create a new file icon. +// + +FileIcon::FileIcon(const char *p, /* I - Filename pattern */ + int t, /* I - File type */ + int nd, /* I - Number of data values */ + short *d) /* I - Data values */ +{ + // Initialize the pattern and type... + pattern_ = p; + type_ = t; + + // Copy icon data as needed... + if (nd) + { + num_data_ = nd; + alloc_data_ = nd + 1; + data_ = (short *)calloc(sizeof(short), nd + 1); + memcpy(data_, d, nd * sizeof(short)); + } + else + { + num_data_ = 0; + alloc_data_ = 0; + } + + // And add the icon to the list of icons... + next_ = first_; + first_ = this; +} + + +// +// 'FileIcon::~FileIcon()' - Remove a file icon. +// + +FileIcon::~FileIcon() +{ + FileIcon *current, // Current icon in list + *prev; // Previous icon in list + + + // Find the icon in the list... + for (current = first_, prev = (FileIcon *)0; + current != this && current != (FileIcon *)0; + prev = current, current = current->next_); + + // Remove the icon from the list as needed... + if (current) + { + if (prev) + prev->next_ = current->next_; + else + first_ = current->next_; + } + + // Free any memory used... + if (alloc_data_) + free(data_); +} + + +// +// 'FileIcon::add()' - Add data to an icon. +// + +short * // O - Pointer to new data value +FileIcon::add(short d) // I - Data to add +{ + short *dptr; // Pointer to new data value + + + // Allocate/reallocate memory as needed + if ((num_data_ + 1) >= alloc_data_) + { + alloc_data_ += 128; + + if (alloc_data_ == 128) + dptr = (short *)malloc(sizeof(short) * alloc_data_); + else + dptr = (short *)realloc(data_, sizeof(short) * alloc_data_); + + if (dptr == NULL) + return (NULL); + + data_ = dptr; + } + + // Store the new data value and return + data_[num_data_++] = d; + data_[num_data_] = END; + + return (data_ + num_data_ - 1); +} + + +// +// 'FileIcon::find()' - Find an icon based upon a given file. +// + +FileIcon * // O - Matching file icon or NULL +FileIcon::find(const char *filename, // I - Name of file */ + int filetype) // I - Enumerated file type +{ + FileIcon *current; // Current file in list + struct stat fileinfo; // Information on file + + + // Get file information if needed... + if (filetype == ANY) + if (!stat(filename, &fileinfo)) + { + if (S_ISDIR(fileinfo.st_mode)) + filetype = DIRECTORY; +#ifdef S_IFIFO + else if (S_ISFIFO(fileinfo.st_mode)) + filetype = FIFO; +#endif // S_IFIFO +#if defined(S_ICHR) && defined(S_IBLK) + else if (S_ISCHR(fileinfo.st_mode) || S_ISBLK(fileinfo.st_mode)) + filetype = DEVICE; +#endif // S_ICHR && S_IBLK +#ifdef S_ILNK + else if (S_ISLNK(fileinfo.st_mode)) + filetype = LINK; +#endif // S_ILNK + else + filetype = PLAIN; + } + + // Loop through the available file types and return any match that + // is found... + for (current = first_; current != (FileIcon *)0; current = current->next_) + if ((current->type_ == filetype || current->type_ == ANY) && + filename_match(filename, current->pattern_)) + break; + + // Return the match (if any)... + return (current); +} + + +// +// 'FileIcon::draw()' - Draw an icon. +// + +void +FileIcon::draw(int x, // I - Upper-lefthand X + int y, // I - Upper-lefthand Y + int w, // I - Width of bounding box + int h, // I - Height of bounding box + Fl_Color ic, // I - Icon color... + int active) // I - Active or inactive? +{ + Fl_Color c; // Current color + short *d; // Pointer to data + short *prim; // Pointer to start of primitive... + double scale; // Scale of icon + + + // Don't try to draw a NULL array! + if (num_data_ == 0) + return; + + // Setup the transform matrix as needed... + scale = w < h ? w : h; + + fl_push_matrix(); + fl_translate((float)x + 0.5 * ((float)w - scale), + (float)y + 0.5 * ((float)h + scale)); + fl_scale(scale, -scale); + + // Loop through the array until we see an unmatched END... + d = data_; + prim = NULL; + c = ic; + + if (active) + fl_color(c); + else + fl_color(fl_inactive(c)); + + while (*d != END || prim) + switch (*d) + { + case END : + switch (*prim) + { + case LINE : + fl_end_line(); + break; + + case CLOSEDLINE : + fl_end_loop(); + break; + + case POLYGON : + fl_end_polygon(); + break; + + case OUTLINEPOLYGON : + fl_end_polygon(); + + if (active) + { + if (prim[1] == 256) + fl_color(ic); + else + fl_color((Fl_Color)prim[1]); + } + else + { + if (prim[1] == 256) + fl_color(fl_inactive(ic)); + else + fl_color(fl_inactive((Fl_Color)prim[1])); + } + + fl_begin_loop(); + + prim += 2; + while (*prim == VERTEX) + { + fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); + prim += 3; + } + + fl_end_loop(); + fl_color(c); + break; + } + + prim = NULL; + d ++; + break; + + case COLOR : + if (d[1] == 256) + c = ic; + else + c = (Fl_Color)d[1]; + + if (!active) + c = fl_inactive(c); + + fl_color(c); + d += 2; + break; + + case LINE : + prim = d; + d ++; + fl_begin_line(); + break; + + case CLOSEDLINE : + prim = d; + d ++; + fl_begin_loop(); + break; + + case POLYGON : + prim = d; + d ++; + fl_begin_polygon(); + break; + + case OUTLINEPOLYGON : + prim = d; + d += 2; + fl_begin_polygon(); + break; + + case VERTEX : + if (prim) + fl_vertex(d[1] * 0.0001, d[2] * 0.0001); + d += 3; + break; + } + + // If we still have an open primitive, close it... + if (prim) + switch (*prim) + { + case LINE : + fl_end_line(); + break; + + case CLOSEDLINE : + fl_end_loop(); + break; + + case POLYGON : + fl_end_polygon(); + break; + + case OUTLINEPOLYGON : + fl_end_polygon(); + + if (active) + { + if (prim[1] == 256) + fl_color(ic); + else + fl_color((Fl_Color)prim[1]); + } + else + { + if (prim[1] == 256) + fl_color(fl_inactive(ic)); + else + fl_color(fl_inactive((Fl_Color)prim[1])); + } + + fl_begin_loop(); + + prim += 2; + while (*prim == VERTEX) + { + fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); + prim += 3; + } + + fl_end_loop(); + fl_color(c); + break; + } + + // Restore the transform matrix + fl_pop_matrix(); +} + + +// +// 'FileIcon::label()' - Set the widget's label to an icon. +// + +void +FileIcon::label(Fl_Widget *w) // I - Widget to label +{ + Fl::set_labeltype(_FL_ICON_LABEL, labeltype, 0); + w->label(_FL_ICON_LABEL, (const char*)this); +} + + +// +// 'FileIcon::labeltype()' - Draw the icon label. +// + +void +FileIcon::labeltype(const Fl_Label *o, // I - Label data + int x, // I - X position of label + int y, // I - Y position of label + int w, // I - Width of label + int h, // I - Height of label + Fl_Align a) // I - Label alignment (not used) +{ + FileIcon *icon; // Pointer to icon data + + + icon = (FileIcon *)(o->value); + + icon->draw(x, y, w, h, (Fl_Color)(o->color)); +} + + +// +// 'FileIcon::load()' - Load an icon file... +// + +void +FileIcon::load(const char *f) // I - File to read from +{ + const char *ext; // File extension + + + if ((ext = filename_ext(f)) == NULL) + { + fprintf(stderr, "FileIcon::load(): Unknown file type for \"%s\".\n", f); + return; + } + + if (strcmp(ext, ".fti") == 0) + load_fti(f); + else if (strcmp(ext, ".xpm") == 0) + load_xpm(f); +#if 0 + else if (strcmp(ext, ".png") == 0) + load_png(f); +#endif /* 0 */ + else + { + fprintf(stderr, "FileIcon::load(): Unknown file type for \"%s\".\n", f); + return; + } +} + + +// +// 'FileIcon::load_fti()' - Load an SGI-format FTI file... +// + +void +FileIcon::load_fti(const char *fti) // I - File to read from +{ + FILE *fp; // File pointer + int ch; // Current character + char command[255], // Command string ("vertex", etc.) + params[255], // Parameter string ("10.0,20.0", etc.) + *ptr; // Pointer into strings + int outline; // Outline polygon + + + // Try to open the file... + if ((fp = fopen(fti, "r")) == NULL) + { + fprintf(stderr, "FileIcon::load_fti(): Unable to open \"%s\" - %s\n", + fti, strerror(errno)); + return; + } + + // Read the entire file, adding data as needed... + outline = 0; + + while ((ch = getc(fp)) != EOF) + { + // Skip whitespace + if (isspace(ch)) + continue; + + // Skip comments starting with "#"... + if (ch == '#') + { + while ((ch = getc(fp)) != EOF) + if (ch == '\n') + break; + + if (ch == EOF) + break; + else + continue; + } + + // OK, this character better be a letter... + if (!isalpha(ch)) + { + fprintf(stderr, "FileIcon::load_fti(): Expected a letter at file position %d (saw '%c')\n", + ftell(fp) - 1, ch); + break; + } + + // Scan the command name... + ptr = command; + *ptr++ = ch; + + while ((ch = getc(fp)) != EOF) + { + if (ch == '(') + break; + else if ((ptr - command) < (sizeof(command) - 1)) + *ptr++ = ch; + } + + *ptr++ = '\0'; + + // Make sure we stopped on a parenthesis... + if (ch != '(') + { + fprintf(stderr, "FileIcon::load_fti(): Expected a ( at file position %d (saw '%c')\n", + ftell(fp) - 1, ch); + break; + } + + // Scan the parameters... + ptr = params; + + while ((ch = getc(fp)) != EOF) + { + if (ch == ')') + break; + else if ((ptr - params) < (sizeof(params) - 1)) + *ptr++ = ch; + } + + *ptr++ = '\0'; + + // Make sure we stopped on a parenthesis... + if (ch != ')') + { + fprintf(stderr, "FileIcon::load_fti(): Expected a ) at file position %d (saw '%c')\n", + ftell(fp) - 1, ch); + break; + } + + // Make sure the next character is a semicolon... + if ((ch = getc(fp)) != ';') + { + fprintf(stderr, "FileIcon::load_fti(): Expected a ; at file position %d (saw '%c')\n", + ftell(fp) - 1, ch); + break; + } + + // Now process the command... + if (strcmp(command, "color") == 0) + { + // Set the color; for negative colors blend the two primaries to + // produce a composite color. Also, the following symbolic color + // names are understood: + // + // name FLTK color + // ------------- ---------- + // iconcolor 256; mapped to the icon color in FileIcon::draw() + // shadowcolor FL_DARK3 + // outlinecolor FL_BLACK + if (strcmp(params, "iconcolor") == 0) + add_color(256); + else if (strcmp(params, "shadowcolor") == 0) + add_color(FL_DARK3); + else if (strcmp(params, "outlinecolor") == 0) + add_color(FL_BLACK); + else + { + short c = atoi(params); // Color value + + + if (c < 0) + { + // Composite color; compute average... + c = -c; + add_color(fl_color_average((Fl_Color)(c >> 4), + (Fl_Color)(c & 15), 0.5)); + } + else + add_color(c); + } + } + else if (strcmp(command, "bgnline") == 0) + add(LINE); + else if (strcmp(command, "bgnclosedline") == 0) + add(CLOSEDLINE); + else if (strcmp(command, "bgnpolygon") == 0) + add(POLYGON); + else if (strcmp(command, "bgnoutlinepolygon") == 0) + { + add(OUTLINEPOLYGON); + outline = add(0) - data_; + } + else if (strcmp(command, "endoutlinepolygon") == 0 && outline) + { + // Set the outline color; see above for valid values... + if (strcmp(params, "iconcolor") == 0) + data_[outline] = 256; + else if (strcmp(params, "shadowcolor") == 0) + data_[outline] = FL_DARK3; + else if (strcmp(params, "outlinecolor") == 0) + data_[outline] = FL_BLACK; + else + { + short c = atoi(params); // Color value + + + if (c < 0) + { + // Composite color; compute average... + c = -c; + data_[outline] = fl_color_average((Fl_Color)(c >> 4), (Fl_Color)(c & 15), 0.5); + } + else + data_[outline] = c; + } + + outline = 0; + add(END); + } + else if (strncmp(command, "end", 3) == 0) + add(END); + else if (strcmp(command, "vertex") == 0) + { + float x, y; // Coordinates of vertex + + + if (sscanf(params, "%f,%f", &x, &y) != 2) + break; + + add_vertex((short)(x * 100.0 + 0.5), (short)(y * 100.0 + 0.5)); + } + else + { + fprintf(stderr, "FileIcon::load_fti(): Unknown command \"%s\" at file position %d.\n", + command, ftell(fp) - 1); + break; + } + } + + // Close the file and return... + fclose(fp); + +#ifdef DEBUG + printf("Icon File \"%s\":\n", fti); + for (int i = 0; i < num_data_; i ++) + printf(" %d,\n", data_[i]); +#endif /* DEBUG */ +} + + +// +// 'FileIcon::load_xpm()' - Load an XPM icon file... +// + +void +FileIcon::load_xpm(const char *xpm) // I - File to read from +{ + FILE *fp; // File pointer + int i, j; // Looping vars + int ch; // Current character + int bg; // Background color + char line[1024], // Line from file + val[16], // Color value + *ptr; // Pointer into line + int x, y; // X & Y in image + int startx; // Starting X coord + int width, height; // Width and height of image + int ncolors; // Number of colors + short colors[256]; // Colors + int red, green, blue; // Red, green, and blue values + + + // Try to open the file... + if ((fp = fopen(xpm, "r")) == NULL) + return; + + // Read the file header until we find the first string... + while (fgets(line, sizeof(line), fp) != NULL) + if ((ptr = strchr(line, '\"')) != NULL) + break; + + if (ptr == NULL) + { + // Nothing to load... + fclose(fp); + return; + } + + // Get the size of the image... + sscanf(ptr + 1, "%d%d%d", &width, &height, &ncolors); + + // Now read the colormap... + memset(colors, 0, sizeof(colors)); + bg = ' '; + + for (i = 0; i < ncolors; i ++) + { + while (fgets(line, sizeof(line), fp) != NULL) + if ((ptr = strchr(line, '\"')) != NULL) + break; + + if (ptr == NULL) + { + // Nothing to load... + fclose(fp); + return; + } + + // Get the color's character + ptr ++; + ch = *ptr++; + + // Get the color value... + if ((ptr = strstr(ptr, "c ")) == NULL) + { + // No color; make this black... + colors[ch] = FL_BLACK; + } + else if (ptr[2] == '#') + { + // Read the RGB triplet... + ptr += 3; + for (j = 0; j < 12; j ++) + if (!isxdigit(ptr[j])) + break; + + switch (j) + { + case 0 : + bg = ch; + default : + red = green = blue = 0; + break; + + case 3 : + val[0] = ptr[0]; + val[1] = '\0'; + red = 255 * strtol(val, NULL, 16) / 15; + + val[0] = ptr[1]; + val[1] = '\0'; + green = 255 * strtol(val, NULL, 16) / 15; + + val[0] = ptr[2]; + val[1] = '\0'; + blue = 255 * strtol(val, NULL, 16) / 15; + break; + + case 6 : + case 9 : + case 12 : + j /= 3; + + val[0] = ptr[0]; + val[1] = ptr[1]; + val[2] = '\0'; + red = strtol(val, NULL, 16); + + val[0] = ptr[j + 0]; + val[1] = ptr[j + 1]; + val[2] = '\0'; + green = strtol(val, NULL, 16); + + val[0] = ptr[2 * j + 0]; + val[1] = ptr[2 * j + 1]; + val[2] = '\0'; + blue = strtol(val, NULL, 16); + break; + } + + if (red == green && green == blue) + colors[ch] = FL_GRAY_RAMP + (FL_NUM_GRAY - 1) * red / 255; + else + colors[ch] = fl_color_cube((FL_NUM_RED - 1) * red / 255, + (FL_NUM_GREEN - 1) * green / 255, + (FL_NUM_BLUE - 1) * blue / 255); + } + else + { + // Read a color name... + if (strncasecmp(ptr + 2, "white", 5) == 0) + colors[ch] = FL_WHITE; + else if (strncasecmp(ptr + 2, "black", 5) == 0) + colors[ch] = FL_BLACK; + else if (strncasecmp(ptr + 2, "none", 4) == 0) + { + colors[ch] = FL_BLACK; + bg = ch; + } + else + colors[ch] = FL_GRAY; + } + } + + // Read the image data... + for (y = height - 1; y >= 0; y --) + { + while (fgets(line, sizeof(line), fp) != NULL) + if ((ptr = strchr(line, '\"')) != NULL) + break; + + if (ptr == NULL) + { + // Nothing to load... + fclose(fp); + return; + } + + ch = bg; + ptr ++; + + for (x = 0; x < width; x ++, ptr ++) + if (*ptr != ch) + { + if (ch != bg) + { + add_color(colors[ch]); + add(POLYGON); + add_vertex(startx * 9000 / width + 1000, y * 9000 / height + 500); + add_vertex(x * 9000 / width + 1000, y * 9000 / height + 500); + add_vertex(x * 9000 / width + 1000, (y + 1) * 9000 / height + 500); + add_vertex(startx * 9000 / width + 1000, (y + 1) * 9000 / height + 500); + add(END); + } + + ch = *ptr; + startx = x; + } + + if (ch != bg) + { + add_color(colors[ch]); + add(POLYGON); + add_vertex(startx * 9000 / width + 1000, y * 9000 / height + 500); + add_vertex(x * 9000 / width + 1000, y * 9000 / height + 500); + add_vertex(x * 9000 / width + 1000, (y + 1) * 9000 / height + 500); + add_vertex(startx * 9000 / width + 1000, (y + 1) * 9000 / height + 500); + add(END); + } + } + + // Close the file and return... + fclose(fp); + +#ifdef DEBUG + printf("Icon File \"%s\":\n", xpm); + for (i = 0; i < num_data_; i ++) + printf(" %d,\n", data_[i]); +#endif /* DEBUG */ +} + + +// +// 'FileIcon::load_system_icons()' - Load the standard system icons/filetypes. + +void +FileIcon::load_system_icons(void) +{ + FileIcon *icon; // New icons + static int init = 0; // Have the icons been initialized? + static short plain[] = // Plain file icon + { + COLOR, 256, OUTLINEPOLYGON, FL_GRAY, + VERTEX, 2000, 1000, VERTEX, 2000, 9000, + VERTEX, 6000, 9000, VERTEX, 8000, 7000, + VERTEX, 8000, 1000, END, OUTLINEPOLYGON, FL_GRAY, + VERTEX, 6000, 9000, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, END, + COLOR, FL_BLACK, LINE, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, VERTEX, 8000, 1000, + VERTEX, 2000, 1000, END, LINE, VERTEX, 3000, 7000, + VERTEX, 5000, 7000, END, LINE, VERTEX, 3000, 6000, + VERTEX, 5000, 6000, END, LINE, VERTEX, 3000, 5000, + VERTEX, 7000, 5000, END, LINE, VERTEX, 3000, 4000, + VERTEX, 7000, 4000, END, LINE, VERTEX, 3000, 3000, + VERTEX, 7000, 3000, END, LINE, VERTEX, 3000, 2000, + VERTEX, 7000, 2000, END, + END + }; + static short image[] = // Image file icon + { + COLOR, 256, OUTLINEPOLYGON, FL_GRAY, + VERTEX, 2000, 1000, VERTEX, 2000, 9000, + VERTEX, 6000, 9000, VERTEX, 8000, 7000, + VERTEX, 8000, 1000, END, OUTLINEPOLYGON, FL_GRAY, + VERTEX, 6000, 9000, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, END, + COLOR, FL_BLACK, LINE, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, VERTEX, 8000, 1000, + VERTEX, 2000, 1000, END, + COLOR, FL_RED, POLYGON, VERTEX, 3500, 2500, + VERTEX, 3000, 3000, VERTEX, 3000, 4000, + VERTEX, 3500, 4500, VERTEX, 4500, 4500, + VERTEX, 5000, 4000, VERTEX, 5000, 3000, + VERTEX, 4500, 2500, END, + COLOR, FL_GREEN, POLYGON, VERTEX, 5500, 2500, + VERTEX, 5000, 3000, VERTEX, 5000, 4000, + VERTEX, 5500, 4500, VERTEX, 6500, 4500, + VERTEX, 7000, 4000, VERTEX, 7000, 3000, + VERTEX, 6500, 2500, END, + COLOR, FL_BLUE, POLYGON, VERTEX, 4500, 3500, + VERTEX, 4000, 4000, VERTEX, 4000, 5000, + VERTEX, 4500, 5500, VERTEX, 5500, 5500, + VERTEX, 6000, 5000, VERTEX, 6000, 4000, + VERTEX, 5500, 3500, END, + END + }; + static short dir[] = // Directory icon + { + COLOR, 256, POLYGON, VERTEX, 1000, 1000, + VERTEX, 1000, 7500, VERTEX, 9000, 7500, + VERTEX, 9000, 1000, END, + POLYGON, VERTEX, 1000, 7500, VERTEX, 2500, 9000, + VERTEX, 5000, 9000, VERTEX, 6500, 7500, END, + COLOR, FL_WHITE, LINE, VERTEX, 1500, 1500, + VERTEX, 1500, 7000, VERTEX, 9000, 7000, END, + COLOR, FL_BLACK, LINE, VERTEX, 9000, 7500, + VERTEX, 9000, 1000, VERTEX, 1000, 1000, END, + COLOR, FL_GRAY, LINE, VERTEX, 1000, 1000, + VERTEX, 1000, 7500, VERTEX, 2500, 9000, + VERTEX, 5000, 9000, VERTEX, 6500, 7500, + VERTEX, 9000, 7500, END, + END + }; + + + // Add symbols if they haven't been added already... + if (!init) + { + if (!access("/usr/share/mimelnk", F_OK)) + { + // Load KDE icons... + icon = new FileIcon("*", FileIcon::PLAIN); + icon->load_xpm("/usr/share/icons/unknown.xpm"); + + load_kde_icons("/usr/share/mimelnk"); + } + else if (!access("/usr/share/icons/folder.xpm", F_OK)) + { + // Load GNOME icons... + icon = new FileIcon("*", FileIcon::PLAIN); + icon->load_xpm("/usr/share/icons/page.xpm"); + + icon = new FileIcon("*", FileIcon::DIRECTORY); + icon->load_xpm("/usr/share/icons/folder.xpm"); + } + else if (!access("/usr/dt/appconfig/icons", F_OK)) + { + // Load CDE icons... + icon = new FileIcon("*", FileIcon::PLAIN); + icon->load_xpm("/usr/dt/appconfig/icons/C/Dtdata.m.pm"); + + icon = new FileIcon("*", FileIcon::DIRECTORY); + icon->load_xpm("/usr/dt/appconfig/icons/C/DtdirB.m.pm"); + + icon = new FileIcon("core", FileIcon::PLAIN); + icon->load_xpm("/usr/dt/appconfig/icons/C/Dtcore.m.pm"); + + icon = new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", FileIcon::PLAIN); + icon->load_xpm("/usr/dt/appconfig/icons/C/Dtimage.m.pm"); + + icon = new FileIcon("*.{eps|pdf|ps}", FileIcon::PLAIN); + icon->load_xpm("/usr/dt/appconfig/icons/C/Dtps.m.pm"); + + icon = new FileIcon("*.ppd", FileIcon::PLAIN); + icon->load_xpm("/usr/dt/appconfig/icons/C/DtPrtpr.m.pm"); + } + else if (!access("/usr/lib/filetype", F_OK)) + { + // Load SGI icons... + icon = new FileIcon("*", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); + + icon = new FileIcon("*", FileIcon::DIRECTORY); + icon->load_fti("/usr/lib/filetype/iconlib/generic.folder.closed.fti"); + + icon = new FileIcon("core", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/default/iconlib/CoreFile.fti"); + + icon = new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/ImageFile.fti"); + + if (!access("/usr/lib/filetype/install/iconlib/acroread.doc.fti", F_OK)) + { + icon = new FileIcon("*.{eps|ps}", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); + + icon = new FileIcon("*.pdf", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/install/iconlib/acroread.doc.fti"); + } + else + { + icon = new FileIcon("*.{eps|pdf|ps}", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); + } + + if (!access("/usr/lib/filetype/install/iconlib/html.fti", F_OK)) + { + icon = new FileIcon("*.{htm|html|shtml}", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); + icon->load_fti("/usr/lib/filetype/install/iconlib/html.fti"); + } + + if (!access("/usr/lib/filetype/install/iconlib/color.ps.idle.fti", F_OK)) + { + icon = new FileIcon("*.ppd", FileIcon::PLAIN); + icon->load_fti("/usr/lib/filetype/install/iconlib/color.ps.idle.fti"); + } + } + else + { + // Create the default icons... + new FileIcon("*", FileIcon::PLAIN, sizeof(plain) / sizeof(plain[0]), plain); + new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", FileIcon::PLAIN, + sizeof(image) / sizeof(image[0]), image); + new FileIcon("*", FileIcon::DIRECTORY, sizeof(dir) / sizeof(dir[0]), dir); + } + + // Mark things as initialized... + init = 1; + } +} + + +// +// 'load_kde_icons()' - Load KDE icon files. +// + +static void +load_kde_icons(const char *directory) // I - Directory to load +{ + int i; // Looping var + int n; // Number of entries in directory + dirent **entries; // Entries in directory + char full[1024]; // Full name of file + + + entries = (dirent **)0; + n = filename_list(directory, &entries); + + for (i = 0; i < n; i ++) + { + if (entries[i]->d_name[0] != '.') + { + strcpy(full, directory); + strcat(full,"/"); + strcat(full, entries[i]->d_name); + + if (filename_isdir(full)) + load_kde_icons(full); + else + load_kde_mimelnk(full); + } + + free((void *)entries[i]); + } + + free((void*)entries); +} + + +// +// 'load_kde_mimelnk()' - Load a KDE "mimelnk" file. +// + +static void +load_kde_mimelnk(const char *filename) +{ + FILE *fp; + char tmp[256]; + char iconfilename[1024]; + char pattern[1024]; + char mimetype[1024]; + char *val; + char full_iconfilename[1024]; + FileIcon *icon; + + + if ((fp = fopen(filename, "r")) != NULL) + { + while (fgets(tmp, sizeof(tmp), fp)) + { + if ((val = get_kde_val(tmp, "Icon")) != NULL) + strcpy(iconfilename, val); + else if ((val = get_kde_val(tmp, "MimeType")) != NULL) + strcpy(mimetype, val); + else if ((val = get_kde_val(tmp, "Patterns")) != NULL) + strcpy(pattern, val); + } + + if (iconfilename && pattern) + { + sprintf(full_iconfilename, "/usr/share/icons/%s", iconfilename); + + if (mimetype && strcmp(mimetype, "inode/directory") == 0) + icon = new FileIcon("*", FileIcon::DIRECTORY); + else + icon = new FileIcon(kde_to_fltk_pattern(pattern), FileIcon::PLAIN); + + icon->load_xpm(full_iconfilename); + } + + fclose(fp); + } +} + + +// +// 'kde_to_fltk_pattern()' - Convert a KDE pattern to a FLTK pattern. +// + +static char * +kde_to_fltk_pattern(const char *kdepattern) +{ + char *pattern, + *patptr; + + + pattern = (char *)malloc(strlen(kdepattern) + 3); + strcpy(pattern, "{"); + strcat(pattern, kdepattern); + + if (pattern[strlen(pattern) - 1] == ';') + pattern[strlen(pattern) - 1] = '\0'; + + strcat(pattern, "}"); + + for (patptr = pattern; *patptr; patptr ++) + if (*patptr == ';') + *patptr = '|'; + + return (pattern); +} + + +// +// 'get_kde_val()' - Get a KDE value. +// + +static char * +get_kde_val(char *str, + const char *key) +{ + while (*str == *key) + { + str ++; + key ++; + } + + if (*key == '\0' && *str == '=') + { + if (str[strlen(str) - 1] == '\n') + str[strlen(str) - 1] = '\0'; + + return (str + 1); + } + + return ((char *)0); +} + + +// +// End of "$Id: FileIcon.cxx,v 1.19 2000/01/22 15:21:07 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileIcon.h b/SrcUnix/espws-2.0/FileIcon.h new file mode 100644 index 0000000..2705a0d --- /dev/null +++ b/SrcUnix/espws-2.0/FileIcon.h @@ -0,0 +1,112 @@ +// +// "$Id: FileIcon.h,v 1.8 2000/01/04 13:45:51 mike Exp $" +// +// FileIcon definitions. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// + +// +// Include necessary header files... +// + +#ifndef _GUI_FILEICON_H_ +# define _GUI_FILEICON_H_ + +# include <FL/Fl.H> + + +// +// FileIcon class... +// + +class FileIcon //// Icon data +{ + static FileIcon *first_; // Pointer to first icon/filetype + FileIcon *next_; // Pointer to next icon/filetype + const char *pattern_; // Pattern string + int type_; // Match only if directory or file? + int num_data_; // Number of data elements + int alloc_data_; // Number of allocated elements + short *data_; // Icon data + + public: + + enum // File types + { + ANY, // Any kind of file + PLAIN, // Only plain files + FIFO, // Only named pipes + DEVICE, // Only character and block devices + LINK, // Only symbolic links + DIRECTORY // Only directories + }; + + enum // Data opcodes + { + END, // End of primitive/icon + COLOR, // Followed by color index + LINE, // Start of line + CLOSEDLINE, // Start of closed line + POLYGON, // Start of polygon + OUTLINEPOLYGON, // Followed by outline color + VERTEX // Followed by scaled X,Y + }; + + FileIcon(const char *p, int t, int nd = 0, short *d = 0); + ~FileIcon(); + + short *add(short d); + short *add_color(short c) + { short *d = add(COLOR); add(c); return (d); } + short *add_vertex(int x, int y) + { short *d = add(VERTEX); add(x); add(y); return (d); } + short *add_vertex(float x, float y) + { short *d = add(VERTEX); add((int)(x * 10000.0)); + add((int)(y * 10000.0)); return (d); } + void clear() { num_data_ = 0; } + void draw(int x, int y, int w, int h, Fl_Color ic, int active = 1); + void label(Fl_Widget *w); + static void labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a); + void load(const char *f); + void load_fti(const char *fti); + void load_xpm(const char *xpm); + const char *pattern() { return (pattern_); } + int size() { return (num_data_); } + int type() { return (type_); } + short *value() { return (data_); } + + static FileIcon *find(const char *filename, int filetype = ANY); + static FileIcon *first() { return (first_); } + static void load_system_icons(void); +}; + +#define _FL_ICON_LABEL FL_FREE_LABELTYPE + +#if FL_MAJOR_VERSION == 1 && FL_MINOR_VERSION == 0 +// FLTK 1.0.x defined these functions without the "fl_" prefix. +#define fl_contrast contrast +#define fl_inactive inactive +#endif + +#endif // !_GUI_FILEICON_H_ + +// +// End of "$Id: FileIcon.h,v 1.8 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileIcon.html b/SrcUnix/espws-2.0/FileIcon.html new file mode 100644 index 0000000..bd60fb9 --- /dev/null +++ b/SrcUnix/espws-2.0/FileIcon.html @@ -0,0 +1,165 @@ +<HTML> +<HEAD> + <TITLE>FileIcon - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class FileIcon</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +<B>FileIcon</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "FileIcon.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>FileIcon</CODE> class manages icon images that can be +used as labels in other widgets and as icons in the <CODE>FileBrowser</CODE> +widget. + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#FileIcon.FileIcon">FileIcon</A> + <LI><A HREF="#FileIcon.~FileIcon">~FileIcon</A> + <LI><A HREF="#FileIcon.add">add</A> + <LI><A HREF="#FileIcon.add_color">add_color</A> + <LI><A HREF="#FileIcon.add_vertex">add_vertex</A> + <LI><A HREF="#FileIcon.clear">clear</A> + <LI><A HREF="#FileIcon.draw">draw</A> + <LI><A HREF="#FileIcon.find">find</A> + <LI><A HREF="#FileIcon.first">first</A> + <LI><A HREF="#FileIcon.label">label</A> + <LI><A HREF="#FileIcon.labeltype">labeltype</A> + <LI><A HREF="#FileIcon.load_fti">load_fti</A> + <LI><A HREF="#FileIcon.load">load</A> + <LI><A HREF="#FileIcon.load_system_icons">load_system_icons</A> + <LI><A HREF="#FileIcon.load_xpm">load_xpm</A> + <LI><A HREF="#FileIcon.pattern">pattern</A> + <LI><A HREF="#FileIcon.size">size</A> + <LI><A HREF="#FileIcon.type">type</A> + <LI><A HREF="#FileIcon.value">value</A> + +</UL> + +<H4><A NAME="FileIcon.FileIcon">FileIcon()</A></H4> + +<P>The constructor creates a new <CODE>FileIcon</CODE> with the specified +information. + +<H4><A NAME="FileIcon.~FileIcon">~FileIcon()</A></H4> + +<P>The destructor destroys the icon and frees all memory that has been +allocated for it. + +<H4><A NAME="FileIcon.add">short *add(short d)</A></H4> + +<P>Adds a keyword value to the icon array, returning a pointer to it. + +<H4><A NAME="FileIcon.add_color">short *add_color(short c)</A></H4> + +<P>Adds a color value to the icon array, returning a pointer to it. + +<H4><A NAME="FileIcon.add_vertex">short *add_vertex(int x, int y)<BR> +short *add_vertex(float x, float y)</A></H4> + +<P>Adds a vertex value to the icon array, returning a pointer to it. +The integer version accepts coordinates from 0 to 10000, while the +floating point version goes from 0.0 to 1.0. The origin (0.0) is in +the lower-lefthand corner of the icon. + +<H4><A NAME="FileIcon.clear">void clear()</A></H4> + +<P>Clears all icon data from the icon. + +<H4><A NAME="FileIcon.draw">void draw(int x, int y, int w, int h, Fl_Color ic, int active = 1)</A></H4> + +<P>Draws the icon in the indicated area. + +<H4><A NAME="FileIcon.find">static FileIcon *find(const char *filename, int filetype = ANY);</A></H4> + +<P>Finds an icon that matches the given filename and file type. + +<H4><A NAME="FileIcon.first">static FileIcon *first()</A></H4> + +<P>Returns a pointer to the first icon in the list. + +<H4><A NAME="FileIcon.label">void label(Fl_Widget *w)</A></H4> + +<P>Applies the icon to the widget, registering the <CODE>FileIcon</CODE> +label type as needed. + +<H4><A NAME="FileIcon.labeltype">static void labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a)</A></H4> + +<P>The labeltype function for icons. + +<H4><A NAME="FileIcon.load">void load(const char *f)</A></H4> + +<P>Loads the specified icon image. The format is deduced from the filename. + +<H4><A NAME="FileIcon.load_fti">void load_fti(const char *fti)</A></H4> + +<P>Loads an SGI icon file. + +<H4><A NAME="FileIcon.load_system_icons">static void load_system_icons(void)</A></H4> + +<P>Loads all system-defined icons. This call is useful when using the +<CODE>FileChooser</CODE> widget and should be used when the application +starts: + +<UL><PRE> +FileIcon::load_system_icons(); +</PRE></UL> + +<H4><A NAME="FileIcon.load_xpm">void load_xpm(const char *xpm)</A></H4> + +<P>Loads an XPM icon file. + +<H4><A NAME="FileIcon.pattern">const char *pattern()</A></H4> + +<P>Returns the filename matching pattern for the icon. + +<H4><A NAME="FileIcon.size">int size()</A></H4> + +<P>Returns the number of words of data used by the icon. + +<H4><A NAME="FileIcon.type">int type()</A></H4> + +<P>Returns the filetype associated with the icon, which can be one of the +following: + +<UL> + <LI><CODE>FileIcon::ANY</CODE>, any kind of file. + <LI><CODE>FileIcon::PLAIN</CODE>, plain files. + <LI><CODE>FileIcon::FIFO</CODE>, named pipes. + <LI><CODE>FileIcon::DEVICE</CODE>, character and block devices. + <LI><CODE>FileIcon::LINK</CODE>, symbolic links. + <LI><CODE>FileIcon::DIRECTORY</CODE>, directories. +</UL> + +<H4><A NAME="FileIcon.value">short *value()</A></H4> + +<P>Returns the data array for the icon. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/FileInput.cxx b/SrcUnix/espws-2.0/FileInput.cxx new file mode 100644 index 0000000..da96749 --- /dev/null +++ b/SrcUnix/espws-2.0/FileInput.cxx @@ -0,0 +1,75 @@ +// +// "$Id: FileInput.cxx,v 1.3 2000/01/04 13:45:51 mike Exp $" +// +// FileInput routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// FileInput::handle() - Handle tab events. +// + +// +// Include necessary header files... +// + +#include <FL/Fl.H> +#include "FileInput.h" + +// +// Note: This has got to be a runner for the world's shortest class. +// Basically the whole purpose of this subclass is to alter the +// behavior of the Tab key; specifically if the user hits the +// Tab key while text is selected, the cursor is moved to the +// end of the selected text rather than doing the navigation +// thing. +// +// This is a likely enhancement to the 2.0 Fl_Input widget... +// + +// +// 'FileInput::handle()' - Handle tab events. +// + +int // O - 1 if we handled the event +FileInput::handle(int event) // I - Event to handle +{ + if (event == FL_KEYBOARD && Fl::event_key() == FL_Tab && + mark() != position()) + { + // Set the current cursor position to the end of the selection... + if (mark() > position()) + position(mark()); + else + position(position()); + + return (1); + } + else + { + // Use the Fl_Input handler... + return (Fl_Input::handle(event)); + } +} + + +// +// End of "$Id: FileInput.cxx,v 1.3 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileInput.h b/SrcUnix/espws-2.0/FileInput.h new file mode 100644 index 0000000..602b8b4 --- /dev/null +++ b/SrcUnix/espws-2.0/FileInput.h @@ -0,0 +1,52 @@ +// +// "$Id: FileInput.h,v 1.3 2000/01/04 13:45:51 mike Exp $" +// +// FileInput definitions. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// + +#ifndef _GUI_FILEINPUT_H_ +# define _GUI_FILEINPUT_H_ + +// +// Include necessary header files... +// + +# include <FL/Fl_Input.H> + + +// +// (world's shortest) FileInput class... +// + +class FileInput : public Fl_Input //// File input widget +{ + public: + + FileInput(int x, int y, int w, int h, const char *l = 0) : + Fl_Input(x, y, w, h, l) {} + int handle(int); +}; + +#endif // !_GUI_FILEINPUT_H_ + +// +// End of "$Id: FileInput.h,v 1.3 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/FileInput.html b/SrcUnix/espws-2.0/FileInput.html new file mode 100644 index 0000000..eb8c1b9 --- /dev/null +++ b/SrcUnix/espws-2.0/FileInput.html @@ -0,0 +1,56 @@ +<HTML> +<HEAD> + <TITLE>FileInput - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class FileInput</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Input + | + +----<B>FileInput</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "FileInput.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>FileInput</CODE> widget has got to be a candidate for the +shortest widget ever. The only difference between it and the <CODE>Fl_Input</CODE> +widget is that when text is selected in the input field, the <KBD>Tab</KBD> key +will move the cursor to the end of the selection and clear the selection, +instead of moving to the next input field. + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#FileInput.FileInput">FileInput</A> + <LI><A HREF="#FileInput.~FileInput">~FileInput</A> + +</UL> + +<H4><A NAME="FileInput.FileInput">FileInput(int xx, int yy, int ww, int hh, const char *l = 0)</A></H4> + +<P>The constructor creates the <CODE>FileInput</CODE> widget at the specified +position and size. + +<H4><A NAME="FileInput.~FileInput">~FileInput()</A></H4> + +<P>The destructor destroys the widget and frees all memory that has been +allocated. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/Fl_Wizard.cxx b/SrcUnix/espws-2.0/Fl_Wizard.cxx new file mode 100644 index 0000000..149d930 --- /dev/null +++ b/SrcUnix/espws-2.0/Fl_Wizard.cxx @@ -0,0 +1,201 @@ +// +// "$Id: Fl_Wizard.cxx,v 1.2 2000/01/04 13:45:51 mike Exp $" +// +// Fl_Wizard widget routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// Fl_Wizard::Fl_Wizard() - Create an Fl_Wizard widget. +// Fl_Wizard::draw() - Draw the wizard border and visible child. +// Fl_Wizard::next() - Show the next child. +// Fl_Wizard::prev() - Show the previous child. +// Fl_Wizard::value() - Return the current visible child. +// Fl_Wizard::value() - Set the visible child. +// + +// +// Include necessary header files... +// + +#include "Fl_Wizard.h" +#include <FL/fl_draw.H> + + +// +// 'Fl_Wizard::Fl_Wizard()' - Create an Fl_Wizard widget. +// + +Fl_Wizard::Fl_Wizard(int xx, // I - Lefthand position + int yy, // I - Upper position + int ww, // I - Width + int hh, // I - Height + const char *l) : // I - Label + Fl_Group(xx, yy, ww, hh, l) +{ + box(FL_THIN_UP_BOX); + + value_ = (Fl_Widget *)0; +} + + +// +// 'Fl_Wizard::draw()' - Draw the wizard border and visible child. +// + +void +Fl_Wizard::draw() +{ + Fl_Widget *kid; // Visible child + + + kid = value(); + + if (damage() & FL_DAMAGE_ALL) + { + // Redraw everything... + if (kid) + { + draw_box(box(), x(), y(), w(), h(), kid->color()); + draw_child(*kid); + } + else + draw_box(box(), x(), y(), w(), h(), color()); + + } + else if (kid) + update_child(*kid); +} + + +// +// 'Fl_Wizard::next()' - Show the next child. +// + +void +Fl_Wizard::next() +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + if ((*kids)->visible()) + break; + + if (num_kids > 1) + value(kids[1]); +} + + +// +// 'Fl_Wizard::prev()' - Show the previous child. +// + + +void +Fl_Wizard::prev() +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + if ((*kids)->visible()) + break; + + if (num_kids > 0 && num_kids < (children() - 1)) + value(kids[-1]); +} + + +// +// 'Fl_Wizard::value()' - Return the current visible child. +// + +Fl_Widget * +Fl_Wizard::value() +{ + int num_kids; + Fl_Widget * const *kids; + Fl_Widget *kid; + + + if ((num_kids = children()) == 0) + return ((Fl_Widget *)0); + + for (kids = array(), kid = (Fl_Widget *)0; num_kids > 0; kids ++, num_kids --) + { + if ((*kids)->visible()) + { + if (kid) + (*kids)->hide(); + else + kid = *kids; + } + } + + if (!kid) + { + kids --; + kid = *kids; + kid->show(); + } + + return (kid); +} + + +// +// 'Fl_Wizard::value()' - Set the visible child. +// + +void +Fl_Wizard::value(Fl_Widget *kid) +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + { + if (*kids == kid) + { + if (!kid->visible()) + kid->show(); + } + else + (*kids)->hide(); + } +} + + +// +// End of "$Id: Fl_Wizard.cxx,v 1.2 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/Fl_Wizard.h b/SrcUnix/espws-2.0/Fl_Wizard.h new file mode 100644 index 0000000..b92bd21 --- /dev/null +++ b/SrcUnix/espws-2.0/Fl_Wizard.h @@ -0,0 +1,59 @@ +// +// "$Id: Fl_Wizard.h,v 1.2 2000/01/04 13:45:51 mike Exp $" +// +// Fl_Wizard widget definitions. +// +// Copyright 1999-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// + +// +// Include necessary header files... +// + +#ifndef _FL_WIZARD_H_ +# define _FL_WIZARD_H_ + +# include <FL/Fl_Group.H> + + +// +// FileBrowser class... +// + +class Fl_Wizard : public Fl_Group +{ + Fl_Widget *value_; + + void draw(); + + public: + + Fl_Wizard(int, int, int, int, const char * = 0); + + void next(); + void prev(); + Fl_Widget *value(); + void value(Fl_Widget *); +}; + +#endif // !_FL_WIZARD_H_ + +// +// End of "$Id: Fl_Wizard.h,v 1.2 2000/01/04 13:45:51 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/Fl_Wizard.html b/SrcUnix/espws-2.0/Fl_Wizard.html new file mode 100644 index 0000000..45b7a42 --- /dev/null +++ b/SrcUnix/espws-2.0/Fl_Wizard.html @@ -0,0 +1,75 @@ +<HTML> +<HEAD> + <TITLE>Fl_Wizard - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class Fl_Wizard</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Group + | + +----<B>Fl_Wizard</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "Fl_Wizard.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>Fl_Wizard</CODE> widget is based off the <CODE>Fl_Tabs</CODE> +widget, but instead of displaying tabs it only changes "tabs" under +program control. Its primary purpose is to support "wizards" that +step a user through configuration or troubleshooting tasks. + +<P>As with <CODE>Fl_Tabs</CODE>, wizard panes are composed of child (usually +<CODE>Fl_Group</CODE>) widgets. Navigation buttons must be added separately. + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#Fl_Wizard.Fl_Wizard">Fl_Wizard</A> + <LI><A HREF="#Fl_Wizard.~Fl_Wizard">~Fl_Wizard</A> + <LI><A HREF="#Fl_Wizard.next">next</A> + <LI><A HREF="#Fl_Wizard.prev">prev</A> + <LI><A HREF="#Fl_Wizard.value">value</A> + +</UL> + +<H4><A NAME="Fl_Wizard.Fl_Wizard">Fl_Wizard(int xx, int yy, int ww, int hh, const char *l = 0)</A></H4> + +<P>The constructor creates the <CODE>Fl_Wizard</CODE> widget at the specified +position and size. + +<H4><A NAME="Fl_Wizard.~Fl_Wizard">~Fl_Wizard()</A></H4> + +<P>The destructor destroys the widget and its children. + +<H4><A NAME="Fl_Wizard.next">void next()</A></H4> + +<P>This method shows the next child of the wizard. If the last child +is already visible, this function does nothing. + +<H4><A NAME="Fl_Wizard.prev">void prev()</A></H4> + +<P>This method shows the previous child of the wizard. If the first child +is already visible, this function does nothing. + +<H4><A NAME="Fl_Wizard.value">void value(Fl_Widget *w)<BR> +Fl_Widget *value()</A></H4> + +<P>Sets or gets the child widget that is visible. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/HelpApp.cxx b/SrcUnix/espws-2.0/HelpApp.cxx new file mode 100644 index 0000000..180a94d --- /dev/null +++ b/SrcUnix/espws-2.0/HelpApp.cxx @@ -0,0 +1,470 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#include "HelpApp.h" + +inline void HelpApp::cb_view__i(HelpView*, void*) { + if (view_->changed()) +{ + index_ ++; + + if (index_ >= 100) + { + memcpy(line_, line_ + 10, sizeof(line_[0]) * 90); + memcpy(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strcpy(file_[index_], view_->filename()); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); + location_->value(view_->filename()); +} +else if (view_->filename()) +{ + strncpy(file_[index_], view_->filename(), 255); + file_[index_][255] = '\0'; + line_[index_] = view_->topline(); +}; +} +void HelpApp::cb_view_(HelpView* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_view__i(o,v); +} + +inline void HelpApp::cb_back__i(Fl_Button*, void*) { + back(); +} +void HelpApp::cb_back_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_back__i(o,v); +} + +inline void HelpApp::cb_forward__i(Fl_Button*, void*) { + forward(); +} +void HelpApp::cb_forward_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_forward__i(o,v); +} + +inline void HelpApp::cb_smaller__i(Fl_Button*, void*) { + if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate(); +} +void HelpApp::cb_smaller_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_smaller__i(o,v); +} + +inline void HelpApp::cb_larger__i(Fl_Button*, void*) { + if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate(); +} +void HelpApp::cb_larger_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_larger__i(o,v); +} + +inline void HelpApp::cb_home__i(Fl_Button*, void*) { + load(homepage_); +} +void HelpApp::cb_home_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_home__i(o,v); +} + +#include <FL/Fl_Bitmap.H> +static unsigned char bits_home[] = +"\200\1@: ,\20(\b0\4 \6`\5\240t/T)T)t)\4+\4)\4)\374?"; +static Fl_Bitmap bitmap_home(bits_home, 16, 16); + +inline void HelpApp::cb_reload__i(Fl_Button*, void*) { + int top = view_->topline(); +view_->load(location_->value()); +view_->topline(top); +} +void HelpApp::cb_reload_(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_reload__i(o,v); +} + +static unsigned char bits_reload[] = +"\0\0\340\7\360\17""8\34\30""8\0p\0\370\4p\16 \37\0\16\0\34\30""8\34\360\17\ +\340\7\0\0"; +static Fl_Bitmap bitmap_reload(bits_reload, 16, 16); + +static unsigned char bits_stop[] = +"\340\7\360\17\370\37\374?\376\177\377\377\211\315\335\252\331\312\333\352\ +\331\355\377\177\376?\374\37\370\17\360\7"; +static Fl_Bitmap bitmap_stop(bits_stop, 16, 16); + +inline void HelpApp::cb_New_i(Fl_Menu_*, void*) { + new HelpApp; +} +void HelpApp::cb_New(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_New_i(o,v); +} + +inline void HelpApp::cb_Close_i(Fl_Menu_*, void*) { + window_->hide(); +} +void HelpApp::cb_Close(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_Close_i(o,v); +} + +inline void HelpApp::cb_Set_i(Fl_Menu_*, void*) { + strcpy(homepage_, location_->value()); +save_bookmarks(); +} +void HelpApp::cb_Set(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_Set_i(o,v); +} + +inline void HelpApp::cb_Set1_i(Fl_Menu_*, void*) { + const char *proxy; + +if ((proxy = fl_input("Enter the URL for the proxy server:", proxy_)) != NULL) +{ + strcpy(proxy_, proxy); + save_bookmarks(); +}; +} +void HelpApp::cb_Set1(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_Set1_i(o,v); +} + +inline void HelpApp::cb_E_i(Fl_Menu_*, void*) { + exit(0); +} +void HelpApp::cb_E(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_E_i(o,v); +} + +Fl_Menu_Item HelpApp::menu_menubar_[] = { + {"&File", 0, 0, 0, 64, 0, 0, 14, 0}, + {"&New", 0x4006e, (Fl_Callback*)HelpApp::cb_New, 0, 0, 0, 0, 14, 0}, + {"&Open...", 0x4006f, 0, 0, 0, 0, 0, 14, 0}, + {"&Close", 0x40077, (Fl_Callback*)HelpApp::cb_Close, 0, 128, 0, 0, 14, 0}, + {"Set &Home Page", 0, (Fl_Callback*)HelpApp::cb_Set, 0, 0, 0, 0, 14, 0}, + {"Set &Proxy", 0, (Fl_Callback*)HelpApp::cb_Set1, 0, 128, 0, 0, 14, 0}, + {"E&xit", 0x40071, (Fl_Callback*)HelpApp::cb_E, 0, 0, 0, 0, 14, 0}, + {0}, + {"&Options", 0, 0, 0, 64, 0, 0, 14, 0}, + {"&Toolbar", 0, 0, 0, 6, 0, 0, 14, 0}, + {"&Location", 0, 0, 0, 134, 0, 0, 14, 0}, + {0}, + {"&Go", 0, 0, 0, 64, 0, 0, 14, 0}, + {"&Back", 0, 0, 0, 0, 0, 0, 14, 0}, + {"&Forward", 0, 0, 0, 0, 0, 0, 14, 0}, + {"&Home", 0, 0, 0, 0, 0, 0, 14, 0}, + {0}, + {0} +}; + +inline void HelpApp::cb_location__i(Fl_Input*, void*) { + load(location_->value()); +} +void HelpApp::cb_location_(Fl_Input* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_location__i(o,v); +} + +inline void HelpApp::cb_bookmark__i(Fl_Menu_Button*, void*) { + show_bookmark(); +} +void HelpApp::cb_bookmark_(Fl_Menu_Button* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_bookmark__i(o,v); +} + +inline void HelpApp::cb_Add_i(Fl_Menu_*, void*) { + add_bookmark(view_->title(), location_->value()); +save_bookmarks(); +} +void HelpApp::cb_Add(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_Add_i(o,v); +} + +inline void HelpApp::cb_Edit_i(Fl_Menu_*, void*) { + edit_bookmarks(); +} +void HelpApp::cb_Edit(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->parent()->user_data()))->cb_Edit_i(o,v); +} + +Fl_Menu_Item HelpApp::menu_bookmark_[] = { + {"Add", 0x40062, (Fl_Callback*)HelpApp::cb_Add, 0, 0, 0, 0, 14, 0}, + {"Edit...", 0, (Fl_Callback*)HelpApp::cb_Edit, 0, 128, 0, 0, 14, 0}, + {0} +}; + +inline void HelpApp::cb_bmList__i(Fl_Browser*, void*) { + list_cb(Fl::event_clicks()); +} +void HelpApp::cb_bmList_(Fl_Browser* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_bmList__i(o,v); +} + +inline void HelpApp::cb_bmProperties__i(Fl_Menu_*, void*) { + list_cb(1); +} +void HelpApp::cb_bmProperties_(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_bmProperties__i(o,v); +} + +inline void HelpApp::cb_Close1_i(Fl_Menu_*, void*) { + bmWindow_->hide(); +} +void HelpApp::cb_Close1(Fl_Menu_* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_Close1_i(o,v); +} + +Fl_Menu_Item HelpApp::menu_bmMenubar_[] = { + {"&Edit", 0, 0, 0, 64, 0, 0, 14, 0}, + {"Delete", 0xffff, 0, 0, 0, 0, 0, 14, 0}, + {"Move Up", 0xffbf, 0, 0, 0, 0, 0, 14, 0}, + {"Move Down", 0xffc0, 0, 0, 128, 0, 0, 14, 0}, + {"Properties", 0xff0d, (Fl_Callback*)HelpApp::cb_bmProperties_, 0, 128, 0, 0, 14, 0}, + {"Close", 0x40077, (Fl_Callback*)HelpApp::cb_Close1, 0, 0, 0, 0, 14, 0}, + {0}, + {0} +}; +Fl_Menu_Item* HelpApp::bmDelete_ = HelpApp::menu_bmMenubar_ + 1; +Fl_Menu_Item* HelpApp::bmMoveUp_ = HelpApp::menu_bmMenubar_ + 2; +Fl_Menu_Item* HelpApp::bmMoveDown_ = HelpApp::menu_bmMenubar_ + 3; +Fl_Menu_Item* HelpApp::bmProperties_ = HelpApp::menu_bmMenubar_ + 4; + +inline void HelpApp::cb_Cancel_i(Fl_Button*, void*) { + propWindow_->hide(); +} +void HelpApp::cb_Cancel(Fl_Button* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_Cancel_i(o,v); +} + +inline void HelpApp::cb_OK_i(Fl_Return_Button*, void*) { + prop_cb(); +propWindow_->hide(); +} +void HelpApp::cb_OK(Fl_Return_Button* o, void* v) { + ((HelpApp*)(o->parent()->user_data()))->cb_OK_i(o,v); +} + +HelpApp::HelpApp() { + Fl_Window* w; + { Fl_Window* o = window_ = new Fl_Window(530, 385, "Help Application"); + w = o; + o->user_data((void*)(this)); + { HelpView* o = view_ = new HelpView(0, 95, 530, 270); + o->box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cb_view_); + o->end(); + Fl_Group::current()->resizable(o); + } + { Fl_Box* o = status_ = new Fl_Box(0, 365, 530, 20, "Ready."); + o->box(FL_FLAT_BOX); + o->labelsize(12); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } + { Fl_Pack* o = toolbar_ = new Fl_Pack(0, 25, 530, 35); + o->type(1); + { Fl_Button* o = back_ = new Fl_Button(0, 25, 35, 35, "@-5<-"); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->shortcut(0xff51); + o->labeltype(FL_SYMBOL_LABEL); + o->labelcolor(2); + o->callback((Fl_Callback*)cb_back_); + } + { Fl_Button* o = forward_ = new Fl_Button(35, 25, 35, 35, "@-5->"); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->shortcut(0xff53); + o->labeltype(FL_SYMBOL_LABEL); + o->labelcolor(2); + o->callback((Fl_Callback*)cb_forward_); + } + { Fl_Button* o = smaller_ = new Fl_Button(70, 25, 35, 35, "F"); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->labelfont(1); + o->labelsize(10); + o->callback((Fl_Callback*)cb_smaller_); + } + { Fl_Button* o = larger_ = new Fl_Button(105, 25, 35, 35, "F"); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->labelfont(1); + o->labelsize(16); + o->callback((Fl_Callback*)cb_larger_); + } + { Fl_Button* o = home_ = new Fl_Button(140, 25, 35, 35); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + bitmap_home.label(o); + o->labelfont(1); + o->labelsize(16); + o->callback((Fl_Callback*)cb_home_); + } + { Fl_Button* o = reload_ = new Fl_Button(175, 25, 35, 35); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->shortcut(0x40072); + bitmap_reload.label(o); + o->labelfont(1); + o->labelsize(16); + o->labelcolor(4); + o->callback((Fl_Callback*)cb_reload_); + } + { Fl_Button* o = stop_ = new Fl_Button(210, 25, 35, 35); + o->box(FL_FLAT_BOX); + o->down_box(FL_THIN_DOWN_BOX); + o->shortcut(0xff1b); + bitmap_stop.label(o); + o->labelfont(1); + o->labelsize(16); + o->labelcolor(1); + o->deactivate(); + } + o->end(); + } + { Fl_Menu_Bar* o = menubar_ = new Fl_Menu_Bar(0, 0, 530, 25); + o->menu(menu_menubar_); + } + { Fl_Group* o = locationbar_ = new Fl_Group(0, 60, 530, 35); + o->box(FL_UP_FRAME); + { Fl_Input* o = location_ = new Fl_Input(180, 65, 345, 25, "Location:"); + o->callback((Fl_Callback*)cb_location_); + o->when(FL_WHEN_ENTER_KEY_ALWAYS); + Fl_Group::current()->resizable(o); + } + { Fl_Menu_Button* o = bookmark_ = new Fl_Menu_Button(5, 65, 105, 25, "Bookmarks"); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_FLAT_BOX); + o->callback((Fl_Callback*)cb_bookmark_); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + o->menu(menu_bookmark_); + } + o->end(); + } + o->end(); + } + { Fl_Window* o = bmWindow_ = new Fl_Window(239, 386, "Bookmarks"); + w = o; + o->user_data((void*)(this)); + { Fl_Browser* o = bmList_ = new Fl_Browser(0, 25, 240, 360); + o->type(3); + o->callback((Fl_Callback*)cb_bmList_); + Fl_Group::current()->resizable(o); + } + { Fl_Menu_Bar* o = bmMenubar_ = new Fl_Menu_Bar(0, 0, 240, 25); + o->menu(menu_bmMenubar_); + } + o->end(); + } + { Fl_Window* o = propWindow_ = new Fl_Window(385, 111, "Bookmark Properties"); + w = o; + o->user_data((void*)(this)); + { Fl_Input* o = propTitle_ = new Fl_Input(50, 10, 325, 25, "Title: "); + o->labelfont(1); + } + { Fl_Input* o = propURL_ = new Fl_Input(50, 40, 325, 25, "URL: "); + o->labelfont(1); + } + { Fl_Button* o = new Fl_Button(310, 75, 65, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel); + } + { Fl_Return_Button* o = new Fl_Return_Button(240, 75, 65, 25, "OK"); + o->callback((Fl_Callback*)cb_OK); + } + o->set_modal(); + o->end(); + } + back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0; +next_ = first_; +first_ = this; +view_->link(link); +if (!bookmenu_) + load_bookmarks(); +window_->show(); +load(homepage_); +} + +int HelpApp::h() { + return (window_->h()); +} + +void HelpApp::hide() { + window_->hide(); +} + +void HelpApp::load(const char *f) { + view_->set_changed(); +view_->load(f); +window_->label(view_->title()); +} + +void HelpApp::position(int xx, int yy) { + window_->position(xx, yy); +} + +void HelpApp::resize(int xx, int yy, int ww, int hh) { + window_->resize(xx, yy, ww, hh); +} + +void HelpApp::show() { + window_->show(); +} + +void HelpApp::textsize(uchar s) { + view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate(); +} + +uchar HelpApp::textsize() { + return (view_->textsize()); +} + +void HelpApp::topline(const char *n) { + view_->topline(n); +} + +void HelpApp::topline(int n) { + view_->topline(n); +} + +int HelpApp::visible() { + return (window_->visible()); +} + +int HelpApp::w() { + return (window_->w()); +} + +int HelpApp::x() { + return (window_->x()); +} + +int HelpApp::y() { + return (window_->y()); +} diff --git a/SrcUnix/espws-2.0/HelpApp.fl b/SrcUnix/espws-2.0/HelpApp.fl new file mode 100644 index 0000000..0d37d5b --- /dev/null +++ b/SrcUnix/espws-2.0/HelpApp.fl @@ -0,0 +1,380 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0008 +header_name {.h} +code_name {.cxx} +gridx 5 +gridy 5 +snap 3 +class HelpApp {open +} { + decl {static Fl_Menu_Item *bookmenu_;} {} + decl {static HelpApp *first_;} {} + decl {struct bookmark { char title[256], url[1024]; };} {} + decl {static int nbookmarks_;} {} + decl {static bookmark *bookmarks_;} {} + decl {static int prop_bookmark_;} {} + decl {static char homepage_[1024];} {} + decl {static char proxy_[1024];} {} + decl {int index_;} {} + decl {int max_;} {} + decl {HelpApp *next_;} {} + decl {int line_[100];} {} + decl {char file_[100][256];} {} + decl {static void add_bookmark(const char *title, const char *url);} {} + decl {static const char *link(const char *f);} {} + decl {static void load_bookmarks();} {} + decl {static void save_bookmarks();} {} + decl {static void set_status(const char *format, ...);} {} + decl {void back();} {} + decl {void forward();} {} + decl {void edit_bookmarks();} {} + decl {void list_cb(int clicks);} {} + decl {void prop_cb();} {} + decl {void show_bookmark();} {} + Function {HelpApp()} {open + } { + Fl_Window window_ { + label {Help Application} open + private xywh {444 35 530 385} hide resizable + code0 {\#include <string.h>} + code1 {\#include <FL/fl_ask.H>} + } { + Fl_Group view_ { + callback {if (view_->changed()) +{ + index_ ++; + + if (index_ >= 100) + { + memcpy(line_, line_ + 10, sizeof(line_[0]) * 90); + memcpy(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strcpy(file_[index_], view_->filename()); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); + location_->value(view_->filename()); +} +else if (view_->filename()) +{ + strncpy(file_[index_], view_->filename(), 255); + file_[index_][255] = '\\0'; + line_[index_] = view_->topline(); +}} open + private xywh {0 95 530 270} box DOWN_BOX resizable + code0 {\#include "HelpView.h"} + class HelpView + } {} + Fl_Box status_ { + label {Ready.} + private xywh {0 365 530 20} box FLAT_BOX labelsize 12 align 20 + } + Fl_Pack toolbar_ { + private xywh {0 25 530 35} type HORIZONTAL + } { + Fl_Button back_ { + label {@-5<-} + callback {back();} + private xywh {0 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX shortcut 0xff51 labeltype SYMBOL_LABEL labelcolor 2 + } + Fl_Button forward_ { + label {@-5->} + callback {forward();} + private xywh {35 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX shortcut 0xff53 labeltype SYMBOL_LABEL labelcolor 2 + } + Fl_Button smaller_ { + label F + callback {if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate();} + private xywh {70 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX labelfont 1 labelsize 10 + } + Fl_Button larger_ { + label F + callback {if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate();} + private xywh {105 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX labelfont 1 labelsize 16 + } + Fl_Button home_ { + label {home.xbm} + callback {load(homepage_);} + private xywh {140 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX labeltype image labelfont 1 labelsize 16 + } + Fl_Button reload_ { + label {reload.xbm} + callback {int top = view_->topline(); +view_->load(location_->value()); +view_->topline(top);} + private xywh {175 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX shortcut 0x40072 labeltype image labelfont 1 labelsize 16 labelcolor 4 + } + Fl_Button stop_ { + label {stop.xbm} + private xywh {210 25 35 35} box FLAT_BOX down_box THIN_DOWN_BOX shortcut 0xff1b labeltype image labelfont 1 labelsize 16 labelcolor 1 deactivate + } + } + Fl_Menu_Bar menubar_ {open + private xywh {0 0 530 25} + } { + submenu {} { + label {&File} open + xywh {0 0 100 20} + } { + menuitem {} { + label {&New} + callback {new HelpApp;} + xywh {0 0 100 20} shortcut 0x4006e + } + menuitem {} { + label {&Open...} + xywh {0 0 100 20} shortcut 0x4006f + } + menuitem {} { + label {&Close} + callback {window_->hide();} + xywh {0 0 100 20} shortcut 0x40077 divider + } + menuitem {} { + label {Set &Home Page} + callback {strcpy(homepage_, location_->value()); +save_bookmarks();} + xywh {0 0 100 20} + } + menuitem {} { + label {Set &Proxy} + callback {const char *proxy; + +if ((proxy = fl_input("Enter the URL for the proxy server:", proxy_)) != NULL) +{ + strcpy(proxy_, proxy); + save_bookmarks(); +}} + xywh {10 10 100 20} divider + } + menuitem {} { + label {E&xit} + callback {exit(0);} + xywh {0 0 100 20} shortcut 0x40071 + code0 {\#include <stdlib.h>} + } + } + submenu {} { + label {&Options} open + xywh {0 0 100 20} + } { + menuitem {} { + label {&Toolbar} + xywh {0 0 100 20} type Toggle value 1 + } + menuitem {} { + label {&Location} + xywh {0 0 100 20} type Toggle value 1 divider + } + } + submenu {} { + label {&Go} open + xywh {0 0 100 20} + } { + menuitem {} { + label {&Back} + xywh {0 0 100 20} + } + menuitem {} { + label {&Forward} + xywh {0 0 100 20} + } + menuitem {} { + label {&Home} + xywh {0 0 100 20} + } + } + } + Fl_Group locationbar_ {open + private xywh {0 60 530 35} box UP_FRAME + } { + Fl_Input location_ { + label {Location:} + callback {load(location_->value());} + private xywh {180 65 345 25} when 10 resizable + } + Fl_Menu_Button bookmark_ { + label Bookmarks + callback {show_bookmark();} open + private xywh {5 65 105 25} box THIN_UP_BOX down_box FLAT_BOX align 20 + } { + menuitem {} { + label Add + callback {add_bookmark(view_->title(), location_->value()); +save_bookmarks();} + xywh {0 0 100 20} shortcut 0x40062 + } + menuitem {} { + label {Edit...} + callback {edit_bookmarks();} + xywh {0 0 100 20} divider + } + } + } + } + Fl_Window bmWindow_ { + label Bookmarks open + private xywh {604 456 239 386} hide resizable + } { + Fl_Browser bmList_ { + callback {list_cb(Fl::event_clicks());} + private xywh {0 25 240 360} type Multi resizable + } + Fl_Menu_Bar bmMenubar_ {open + private xywh {0 0 240 25} + } { + submenu {} { + label {&Edit} open + xywh {0 0 100 20} + } { + menuitem bmDelete_ { + label Delete + private xywh {0 0 100 20} shortcut 0xffff + } + menuitem bmMoveUp_ { + label {Move Up} selected + private xywh {0 0 100 20} shortcut 0xffbf + } + menuitem bmMoveDown_ { + label {Move Down} + private xywh {0 0 100 20} shortcut 0xffc0 divider + } + menuitem bmProperties_ { + label Properties + callback {list_cb(1);} + private xywh {0 0 100 20} shortcut 0xff0d divider + } + menuitem {} { + label Close + callback {bmWindow_->hide();} + private xywh {0 0 100 20} shortcut 0x40077 + } + } + } + } + Fl_Window propWindow_ { + label {Bookmark Properties} open + private xywh {340 68 385 111} hide modal + } { + Fl_Input propTitle_ { + label {Title: } + private xywh {50 10 325 25} labelfont 1 + } + Fl_Input propURL_ { + label {URL: } + private xywh {50 40 325 25} labelfont 1 + } + Fl_Button {} { + label Cancel + callback {propWindow_->hide();} + xywh {310 75 65 25} + } + Fl_Return_Button {} { + label OK + callback {prop_cb(); +propWindow_->hide();} + xywh {240 75 65 25} + } + } + code {back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0; +next_ = first_; +first_ = this; +view_->link(link); +if (!bookmenu_) + load_bookmarks(); +window_->show(); +load(homepage_);} {} + } + Function {h()} {return_type int + } { + code {return (window_->h());} {} + } + Function {hide()} {return_type void + } { + code {window_->hide();} {} + } + Function {load(const char *f)} {return_type void + } { + code {view_->set_changed(); +view_->load(f); +window_->label(view_->title());} {} + } + Function {position(int xx, int yy)} {return_type void + } { + code {window_->position(xx, yy);} {} + } + Function {resize(int xx, int yy, int ww, int hh)} {return_type void + } { + code {window_->resize(xx, yy, ww, hh);} {} + } + Function {show()} {return_type void + } { + code {window_->show();} {} + } + Function {textsize(uchar s)} {return_type void + } { + code {view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate();} {} + } + Function {textsize()} {return_type uchar + } { + code {return (view_->textsize());} {} + } + Function {topline(const char *n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {topline(int n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {visible()} {return_type int + } { + code {return (window_->visible());} {} + } + Function {w()} {return_type int + } { + code {return (window_->w());} {} + } + Function {x()} {return_type int + } { + code {return (window_->x());} {} + } + Function {y()} {return_type int + } { + code {return (window_->y());} {} + } +} diff --git a/SrcUnix/espws-2.0/HelpApp.gif b/SrcUnix/espws-2.0/HelpApp.gif Binary files differnew file mode 100644 index 0000000..66c8fab --- /dev/null +++ b/SrcUnix/espws-2.0/HelpApp.gif diff --git a/SrcUnix/espws-2.0/HelpApp.h b/SrcUnix/espws-2.0/HelpApp.h new file mode 100644 index 0000000..4ed89d0 --- /dev/null +++ b/SrcUnix/espws-2.0/HelpApp.h @@ -0,0 +1,135 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#ifndef HelpApp_h +#define HelpApp_h +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <string.h> +#include <FL/fl_ask.H> +#include "HelpView.h" +#include <FL/Fl_Box.H> +#include <FL/Fl_Pack.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Menu_Bar.H> +#include <stdlib.h> +#include <FL/Fl_Group.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Menu_Button.H> +#include <FL/Fl_Browser.H> +#include <FL/Fl_Return_Button.H> + +class HelpApp { + static Fl_Menu_Item *bookmenu_; + static HelpApp *first_; + struct bookmark { char title[256], url[1024]; }; + static int nbookmarks_; + static bookmark *bookmarks_; + static int prop_bookmark_; + static char homepage_[1024]; + static char proxy_[1024]; + int index_; + int max_; + HelpApp *next_; + int line_[100]; + char file_[100][256]; + static void add_bookmark(const char *title, const char *url); + static const char *link(const char *f); + static void load_bookmarks(); + static void save_bookmarks(); + static void set_status(const char *format, ...); + void back(); + void forward(); + void edit_bookmarks(); + void list_cb(int clicks); + void prop_cb(); + void show_bookmark(); +public: + HelpApp(); +private: + Fl_Window *window_; + HelpView *view_; + inline void cb_view__i(HelpView*, void*); + static void cb_view_(HelpView*, void*); + Fl_Box *status_; + Fl_Pack *toolbar_; + Fl_Button *back_; + inline void cb_back__i(Fl_Button*, void*); + static void cb_back_(Fl_Button*, void*); + Fl_Button *forward_; + inline void cb_forward__i(Fl_Button*, void*); + static void cb_forward_(Fl_Button*, void*); + Fl_Button *smaller_; + inline void cb_smaller__i(Fl_Button*, void*); + static void cb_smaller_(Fl_Button*, void*); + Fl_Button *larger_; + inline void cb_larger__i(Fl_Button*, void*); + static void cb_larger_(Fl_Button*, void*); + Fl_Button *home_; + inline void cb_home__i(Fl_Button*, void*); + static void cb_home_(Fl_Button*, void*); + Fl_Button *reload_; + inline void cb_reload__i(Fl_Button*, void*); + static void cb_reload_(Fl_Button*, void*); + Fl_Button *stop_; + Fl_Menu_Bar *menubar_; + static Fl_Menu_Item menu_menubar_[]; + inline void cb_New_i(Fl_Menu_*, void*); + static void cb_New(Fl_Menu_*, void*); + inline void cb_Close_i(Fl_Menu_*, void*); + static void cb_Close(Fl_Menu_*, void*); + inline void cb_Set_i(Fl_Menu_*, void*); + static void cb_Set(Fl_Menu_*, void*); + inline void cb_Set1_i(Fl_Menu_*, void*); + static void cb_Set1(Fl_Menu_*, void*); + inline void cb_E_i(Fl_Menu_*, void*); + static void cb_E(Fl_Menu_*, void*); + Fl_Group *locationbar_; + Fl_Input *location_; + inline void cb_location__i(Fl_Input*, void*); + static void cb_location_(Fl_Input*, void*); + Fl_Menu_Button *bookmark_; + inline void cb_bookmark__i(Fl_Menu_Button*, void*); + static void cb_bookmark_(Fl_Menu_Button*, void*); + static Fl_Menu_Item menu_bookmark_[]; + inline void cb_Add_i(Fl_Menu_*, void*); + static void cb_Add(Fl_Menu_*, void*); + inline void cb_Edit_i(Fl_Menu_*, void*); + static void cb_Edit(Fl_Menu_*, void*); + Fl_Window *bmWindow_; + Fl_Browser *bmList_; + inline void cb_bmList__i(Fl_Browser*, void*); + static void cb_bmList_(Fl_Browser*, void*); + Fl_Menu_Bar *bmMenubar_; + static Fl_Menu_Item menu_bmMenubar_[]; + static Fl_Menu_Item *bmDelete_; + static Fl_Menu_Item *bmMoveUp_; + static Fl_Menu_Item *bmMoveDown_; + static Fl_Menu_Item *bmProperties_; + inline void cb_bmProperties__i(Fl_Menu_*, void*); + static void cb_bmProperties_(Fl_Menu_*, void*); + inline void cb_Close1_i(Fl_Menu_*, void*); + static void cb_Close1(Fl_Menu_*, void*); + Fl_Window *propWindow_; + Fl_Input *propTitle_; + Fl_Input *propURL_; + inline void cb_Cancel_i(Fl_Button*, void*); + static void cb_Cancel(Fl_Button*, void*); + inline void cb_OK_i(Fl_Return_Button*, void*); + static void cb_OK(Fl_Return_Button*, void*); +public: + int h(); + void hide(); + void load(const char *f); + void position(int xx, int yy); + void resize(int xx, int yy, int ww, int hh); + void show(); + void textsize(uchar s); + uchar textsize(); + void topline(const char *n); + void topline(int n); + int visible(); + int w(); + int x(); + int y(); +}; +#endif diff --git a/SrcUnix/espws-2.0/HelpApp2.cxx b/SrcUnix/espws-2.0/HelpApp2.cxx new file mode 100644 index 0000000..9b12150 --- /dev/null +++ b/SrcUnix/espws-2.0/HelpApp2.cxx @@ -0,0 +1,546 @@ +// +// "$Id: HelpApp2.cxx,v 1.5 2000/03/19 19:10:20 mike Exp $" +// +// Help Application extra routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outblockd in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// HelpApp::add_bookmark() - Add a bookmark. +// HelpApp::link() - Handle web accesses... +// HelpApp::load_bookmarks() - Load bookmarks from disk. +// HelpApp::save_bookmarks() - Save bookmarks to disk. +// HelpApp::set_status() - Set the current status... +// HelpApp::back() - Show the previous document in the history. +// HelpApp::forward() - Show the next document in the history. +// + +// +// Include necessary header files... +// + +#include "HelpApp.h" +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <errno.h> + +#ifdef HAVE_LIBCUPS +# include <cups/http.h> +#endif // HAVE_LIBCUPS */ + + +// +// Globals for all windows... +// + +Fl_Menu_Item *HelpApp::bookmenu_ = (Fl_Menu_Item *)0; +HelpApp *HelpApp::first_ = (HelpApp *)0; +int HelpApp::nbookmarks_ = 0; +HelpApp::bookmark *HelpApp::bookmarks_; +int HelpApp::prop_bookmark_ = 0; +char HelpApp::proxy_[1024] = ""; +char HelpApp::homepage_[1024] = "http://www.fltk.org"; + + +// +// 'HelpApp::add_bookmark()' - Add a bookmark. +// + +void +HelpApp::add_bookmark(const char *title, // I - Title + const char *url) // I - URL +{ + char buffer[1024], // Title name buffer + *bufptr; // Pointer into buffer + const char *titleptr; // Pointer into title + bookmark *temp; // New bookmark array + Fl_Menu_Item *menu; // New menu array + HelpApp *w; // Help windows + + + if (nbookmarks_ == 0) + temp = (bookmark *)malloc(sizeof(struct bookmark)); + else + temp = (bookmark *)realloc(bookmarks_, (nbookmarks_ + 1) * sizeof(struct bookmark)); + + if (!temp) + return; + + bookmarks_ = temp; + temp += nbookmarks_; + nbookmarks_ ++; + + strcpy(temp->title, title); + strcpy(temp->url, url); + + if (!bookmenu_) + { + menu = (Fl_Menu_Item *)malloc(sizeof(Fl_Menu_Item) * 4); + if (menu) + memcpy(menu, first_->bookmark_->menu(), sizeof(Fl_Menu_Item) * 2); + } + else + menu = (Fl_Menu_Item *)realloc(bookmenu_, sizeof(Fl_Menu_Item) * (3 + nbookmarks_)); + + if (!menu) + return; + + bookmenu_ = menu; + menu += 1 + nbookmarks_; + + for (bufptr = buffer, titleptr = title; *titleptr;) + { + if (*titleptr == '/') + *bufptr++ = '\\'; + *bufptr++ = *titleptr++; + } + + *bufptr++ = '\0'; + + memset(menu, 0, 2 * sizeof(Fl_Menu_Item)); + menu->text = strdup(buffer); + + for (w = first_; w; w = w->next_) + w->bookmark_->menu(bookmenu_); +} + + +// +// 'HelpApp::link()' - Handle web accesses... +// + +const char * // O - New filename or NULL +HelpApp::link(const char *url) // I - URL for access... +{ +#ifdef HAVE_LIBCUPS + char method[HTTP_MAX_URI], // URL method + username[HTTP_MAX_URI], // Username from URL + hostname[HTTP_MAX_URI], // Hostname from URL + host[HTTP_MAX_URI], // Host: field + resource[HTTP_MAX_URI]; // Resource from URL + int port; // Port number for method + http_t *http; // HTTP connection + http_status_t status; // HTTP status + FILE *fp; // Temporary file + char buffer[8192]; // Copy buffer + int bytes; // Number of bytes read + int tbytes; // Total number of bytes read + int length; // Content length + static char tempfile[1024]; // Temporary filename + static char auth[255] = ""; // Authentication string + + + if (strncmp(url, "file:", 5) == 0 || strchr(url, ':') == NULL) + return (url); + + httpSeparate(url, method, username, hostname, &port, resource); + strcpy(host, hostname); + + if (proxy_[0]) + { + httpSeparate(proxy_, method, username, hostname, &port, resource); + strcpy(resource, url); + } + + if (strcmp(method, "http") != 0 && strcmp(method, "ipp") != 0) + return (NULL); + + set_status("Contacting host %s...", hostname); + + if ((http = httpConnect(hostname, port)) == NULL) + { + set_status(NULL); + fl_alert("Unable to connect to %s:\n\n%s", hostname, strerror(errno)); + return (NULL); + } + + if (username[0]) + httpEncode64(auth, username); + + set_status("Host contacted, sending request..."); + + // Do HTTP GET requests until we succeed or error out... + do + { + httpClearFields(http); + httpSetField(http, HTTP_FIELD_HOST, host); + + if (auth[0]) + { + sprintf(buffer, "Basic %s", auth); + httpSetField(http, HTTP_FIELD_AUTHORIZATION, buffer); + } + + if (httpGet(http, resource)) + { + status = HTTP_UNAUTHORIZED; + continue; + } + + while ((status = httpUpdate(http)) == HTTP_CONTINUE); + + if (status == HTTP_UNAUTHORIZED) + { + const char *userpass; + + + sprintf(buffer, "Authentication required.\nEnter username:password for %s:", + host); + if ((userpass = fl_input(buffer, username)) == NULL) + break; + + httpEncode64(auth, userpass); + httpFlush(http); + } + } + while (status == HTTP_UNAUTHORIZED); + + // Copy the output from the server to a single temp file (no caching for now) + sprintf(tempfile, "%s/%d.html", + getenv("TMPDIR") == NULL ? "/var/tmp" : getenv("TMPDIR"), getuid()); + if ((fp = fopen(tempfile, "wb")) == NULL) + { + set_status(NULL); + httpClose(http); + return (NULL); + } + + length = atoi(httpGetField(http, HTTP_FIELD_CONTENT_LENGTH)); + tbytes = 0; + while ((bytes = httpRead(http, buffer, sizeof(buffer))) > 0) + { + tbytes += bytes; + + if (length == 0) + set_status("Received %d bytes...", tbytes); + else + set_status("Received %d of %d bytes (%d%%)...", tbytes, length, + 100 * tbytes / length); + + fwrite(buffer, 1, bytes, fp); + } + + set_status(NULL); + fclose(fp); + httpClose(http); + + return (tempfile); +#else + return (url); +#endif // HAVE_LIBCUPS +} + + +// +// 'HelpApp::load_bookmarks()' - Load bookmarks from disk. +// + +void +HelpApp::load_bookmarks() +{ + char flsurfrc[1024]; // Filename + FILE *fp; // .flsurfrc file + char title[1024], // Title from file + url[1024]; // URL from file + + + if (getenv("HOME") == NULL) + return; + + sprintf(flsurfrc, "%s/.flsurfrc", getenv("HOME")); + + if ((fp = fopen(flsurfrc, "r")) == NULL) + return; + + // Read home page URL and strip LF... + fgets(homepage_, sizeof(homepage_), fp); + homepage_[strlen(homepage_) - 1] = '\0'; + + // Read proxy URL and strip LF... + fgets(proxy_, sizeof(proxy_), fp); + proxy_[strlen(proxy_) - 1] = '\0'; + + // Read pairs of lines with the bookmark title and URL... + while (fgets(title, sizeof(title), fp) != NULL) + { + // Strip title LF + title[strlen(title) - 1] = '\0'; + + // Read URL and strip LF + fgets(url, sizeof(url), fp); + url[strlen(url) - 1] = '\0'; + + // Add the bookmark... + add_bookmark(title, url); + } + + fclose(fp); +} + + +// +// 'HelpApp::save_bookmarks()' - Save bookmarks to disk. +// + +void +HelpApp::save_bookmarks() +{ + int i; // Looping var + char flsurfrc[1024]; // Filename + FILE *fp; // .flsurfrc file + + + if (getenv("HOME") == NULL) + return; + + sprintf(flsurfrc, "%s/.flsurfrc", getenv("HOME")); + + if ((fp = fopen(flsurfrc, "w")) == NULL) + return; + + // Write home page URL and strip LF... + fprintf(fp, "%s\n", homepage_); + + // Write proxy URL and strip LF... + fprintf(fp, "%s\n", proxy_); + + // Write pairs of lines with the bookmark title and URL... + for (i = 0; i < nbookmarks_; i ++) + { + fprintf(fp, "%s\n", bookmarks_[i].title); + fprintf(fp, "%s\n", bookmarks_[i].url); + } + + fclose(fp); +} + + +// +// 'HelpApp::set_status()' - Set the current status... +// + +void +HelpApp::set_status(const char *format, // I - printf-style string + ...) // I - Additional args as needed +{ + va_list ap; // Pointer to additional args + Fl_Cursor cursor; // Cursor to use... + HelpApp *w; // Help windows + static char status[1024]; // Status string... + + + if (format == NULL) + { + cursor = FL_CURSOR_DEFAULT; + strcpy(status, "Ready."); + } + else + { + cursor = FL_CURSOR_WAIT; + va_start(ap, format); + vsprintf(status, format, ap); + va_end(ap); + } + + for (w = first_; w != NULL; w = w->next_) + { + w->window_->cursor(cursor); + w->status_->label(status); + w->status_->redraw(); + + if (format) + w->stop_->activate(); + else + w->stop_->deactivate(); + } + + Fl::check(); +} + + +// +// 'HelpApp::back()' - Show the previous document in the history. +// + +void +HelpApp::back() +{ + if (index_ > 0) + index_ --; + + if (index_ == 0) + back_->deactivate(); + + forward_->activate(); + + if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + + view_->topline(line_[index_]); + location_->value(view_->filename()); + window_->label(view_->title()); +} + + +// +// 'HelpApp::forward()' - Show the next document in the history. +// + +void +HelpApp::forward() +{ + if (index_ < max_) + index_ ++; + + if (index_ >= max_) + forward_->deactivate(); + + back_->activate(); + + if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + + view_->topline(line_[index_]); + location_->value(view_->filename()); + window_->label(view_->title()); +} + + +// +// 'HelpApp::show_bookmark()' - Show a bookmark... +// + +void +HelpApp::show_bookmark() +{ + if (bookmark_->value() < 2) + return; + + load(bookmarks_[bookmark_->value() - 2].url); +} + + +// +// 'HelpApp::edit_bookmarks()' - Show the bookmark editing window. +// + +void +HelpApp::edit_bookmarks() +{ + HelpApp *h; // Current help windows... + int i; // Looping var + bookmark *b; // Current bookmark + + + // See if the bookmarks window is already open from another window... + for (h = first_; h != (HelpApp *)0; h = h->next_) + if (h->bmWindow_->shown()) + break; + + if (h) + h->bmWindow_->show(); // Raise the current window + else + { + // Fill the list with the current bookmarks... + bmList_->clear(); + for (i = nbookmarks_, b = bookmarks_; i > 0; i --, b ++) + bmList_->add(b->title); + + // Show the window... + bmWindow_->show(); + } +} + + +// +// 'HelpApp::list_cb()' - Handle clicks in the bookmark list. +// + +void +HelpApp::list_cb(int clicks) +{ + int i; // Current item + bookmark *b; // Current bookmark... + + + i = bmList_->value() - 1; + + if (clicks && i >= 0) + { + // Double-click in list; show properties of current item... + b = bookmarks_ + i; + prop_bookmark_ = i; + + propTitle_->value(b->title); + propURL_->value(b->url); + propWindow_->show(); + } + else if (i) + { + bmDelete_->deactivate(); + bmMoveUp_->deactivate(); + bmMoveDown_->deactivate(); + bmProperties_->deactivate(); + } + else + { + bmDelete_->activate(); + bmMoveUp_->activate(); + bmMoveDown_->activate(); + bmProperties_->activate(); + } +} + + +// +// 'HelpApp::prop_cb()' - Apply the changes to the current bookmark... +// + +void +HelpApp::prop_cb() +{ + HelpApp *h; // Current help windows... + bookmark *b; // Bookmark to change + + + // See which properties window is open... + for (h = first_; h != (HelpApp *)0; h = h->next_) + if (h->propWindow_->shown()) + break; + + if (h) + { + // Found it; copy the new values over... + b = bookmarks_ + prop_bookmark_; + strncpy(b->title, h->propTitle_->value(), sizeof(b->title) - 1); + strncpy(b->url, h->propURL_->value(), sizeof(b->url) - 1); + + h->bmList_->remove(prop_bookmark_ + 1); + h->bmList_->insert(prop_bookmark_ + 1, b->title); + + save_bookmarks(); + } +} + + +// +// End of "$Id: HelpApp2.cxx,v 1.5 2000/03/19 19:10:20 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/HelpDialog.cxx b/SrcUnix/espws-2.0/HelpDialog.cxx new file mode 100644 index 0000000..9d1ee5c --- /dev/null +++ b/SrcUnix/espws-2.0/HelpDialog.cxx @@ -0,0 +1,219 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#include "HelpDialog.h" + +inline void HelpDialog::cb_view__i(HelpView*, void*) { + if (view_->changed()) +{ + index_ ++; + + if (index_ >= 100) + { + memcpy(line_, line_ + 10, sizeof(line_[0]) * 90); + memcpy(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strcpy(file_[index_], view_->filename()); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); +} +else if (view_->filename()) +{ + strncpy(file_[index_], view_->filename(), 255); + file_[index_][255] = '\0'; + line_[index_] = view_->topline(); +}; +} +void HelpDialog::cb_view_(HelpView* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_view__i(o,v); +} + +inline void HelpDialog::cb_Close_i(Fl_Button*, void*) { + window_->hide(); +} +void HelpDialog::cb_Close(Fl_Button* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_Close_i(o,v); +} + +inline void HelpDialog::cb_back__i(Fl_Button*, void*) { + if (index_ > 0) + index_ --; + +if (index_ == 0) + back_->deactivate(); + +forward_->activate(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(line_[index_]); +} +void HelpDialog::cb_back_(Fl_Button* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_back__i(o,v); +} + +inline void HelpDialog::cb_forward__i(Fl_Button*, void*) { + if (index_ < max_) + index_ ++; + +if (index_ >= max_) + forward_->deactivate(); + +back_->activate(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(line_[index_]); +} +void HelpDialog::cb_forward_(Fl_Button* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_forward__i(o,v); +} + +inline void HelpDialog::cb_smaller__i(Fl_Button*, void*) { + if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate(); +} +void HelpDialog::cb_smaller_(Fl_Button* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_smaller__i(o,v); +} + +inline void HelpDialog::cb_larger__i(Fl_Button*, void*) { + if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate(); +} +void HelpDialog::cb_larger_(Fl_Button* o, void* v) { + ((HelpDialog*)(o->parent()->user_data()))->cb_larger__i(o,v); +} + +HelpDialog::HelpDialog() { + Fl_Window* w; + { Fl_Window* o = window_ = new Fl_Window(530, 385, "Help Dialog"); + w = o; + o->user_data((void*)(this)); + { HelpView* o = view_ = new HelpView(10, 10, 510, 330); + o->box(FL_DOWN_BOX); + o->callback((Fl_Callback*)cb_view_); + o->end(); + Fl_Group::current()->resizable(o); + } + { Fl_Button* o = new Fl_Button(465, 350, 55, 25, "Close"); + o->callback((Fl_Callback*)cb_Close); + } + { Fl_Button* o = back_ = new Fl_Button(405, 350, 25, 25, "@<-"); + o->shortcut(0xff51); + o->labeltype(FL_SYMBOL_LABEL); + o->labelcolor(2); + o->callback((Fl_Callback*)cb_back_); + } + { Fl_Button* o = forward_ = new Fl_Button(435, 350, 25, 25, "@->"); + o->shortcut(0xff53); + o->labeltype(FL_SYMBOL_LABEL); + o->labelcolor(2); + o->callback((Fl_Callback*)cb_forward_); + } + { Fl_Button* o = smaller_ = new Fl_Button(345, 350, 25, 25, "F"); + o->labelfont(1); + o->labelsize(10); + o->callback((Fl_Callback*)cb_smaller_); + } + { Fl_Button* o = larger_ = new Fl_Button(375, 350, 25, 25, "F"); + o->labelfont(1); + o->labelsize(16); + o->callback((Fl_Callback*)cb_larger_); + } + o->end(); + } + back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0; +} + +int HelpDialog::h() { + return (window_->h()); +} + +void HelpDialog::hide() { + window_->hide(); +} + +void HelpDialog::load(const char *f) { + view_->set_changed(); +view_->load(f); +window_->label(view_->title()); +} + +void HelpDialog::position(int xx, int yy) { + window_->position(xx, yy); +} + +void HelpDialog::resize(int xx, int yy, int ww, int hh) { + window_->resize(xx, yy, ww, hh); +} + +void HelpDialog::show() { + window_->show(); +} + +void HelpDialog::textsize(uchar s) { + view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate(); +} + +uchar HelpDialog::textsize() { + return (view_->textsize()); +} + +void HelpDialog::topline(const char *n) { + view_->topline(n); +} + +void HelpDialog::topline(int n) { + view_->topline(n); +} + +int HelpDialog::visible() { + return (window_->visible()); +} + +int HelpDialog::w() { + return (window_->w()); +} + +int HelpDialog::x() { + return (window_->x()); +} + +int HelpDialog::y() { + return (window_->y()); +} diff --git a/SrcUnix/espws-2.0/HelpDialog.fl b/SrcUnix/espws-2.0/HelpDialog.fl new file mode 100644 index 0000000..a2b3278 --- /dev/null +++ b/SrcUnix/espws-2.0/HelpDialog.fl @@ -0,0 +1,188 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.00 +header_name {.h} +code_name {.cxx} +gridx 5 +gridy 5 +snap 3 +class HelpDialog {open +} { + decl {int index_;} {} + decl {int max_;} {} + decl {int line_[100];} {} + decl {char file_[100][256];} {} + Function {HelpDialog()} {open + } { + Fl_Window window_ { + label {Help Dialog} open + private xywh {459 351 530 385} resizable + code0 {\#include <string.h>} visible + } { + Fl_Group view_ { + callback {if (view_->changed()) +{ + index_ ++; + + if (index_ >= 100) + { + memcpy(line_, line_ + 10, sizeof(line_[0]) * 90); + memcpy(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strcpy(file_[index_], view_->filename()); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); +} +else if (view_->filename()) +{ + strncpy(file_[index_], view_->filename(), 255); + file_[index_][255] = '\\0'; + line_[index_] = view_->topline(); +}} open + private xywh {10 10 510 330} box DOWN_BOX resizable + code0 {\#include "HelpView.h"} + class HelpView + } {} + Fl_Button {} { + label Close + callback {window_->hide();} + xywh {465 350 55 25} + } + Fl_Button back_ { + label {@<-} + callback {if (index_ > 0) + index_ --; + +if (index_ == 0) + back_->deactivate(); + +forward_->activate(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(line_[index_]);} + private xywh {405 350 25 25} shortcut 0xff51 labeltype SYMBOL_LABEL labelcolor 2 + } + Fl_Button forward_ { + label {@->} + callback {if (index_ < max_) + index_ ++; + +if (index_ >= max_) + forward_->deactivate(); + +back_->activate(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(line_[index_]);} + private xywh {435 350 25 25} shortcut 0xff53 labeltype SYMBOL_LABEL labelcolor 2 + } + Fl_Button smaller_ { + label F + callback {if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate();} + private xywh {345 350 25 25} labelfont 1 labelsize 10 + } + Fl_Button larger_ { + label F + callback {if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate();} + private xywh {375 350 25 25} labelfont 1 labelsize 16 + } + } + code {back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0;} {} + } + Function {h()} {selected return_type int + } { + code {return (window_->h());} {} + } + Function {hide()} {return_type void + } { + code {window_->hide();} {} + } + Function {load(const char *f)} {return_type void + } { + code {view_->set_changed(); +view_->load(f); +window_->label(view_->title());} {} + } + Function {position(int xx, int yy)} {return_type void + } { + code {window_->position(xx, yy);} {} + } + Function {resize(int xx, int yy, int ww, int hh)} {return_type void + } { + code {window_->resize(xx, yy, ww, hh);} {} + } + Function {show()} {return_type void + } { + code {window_->show();} {} + } + Function {textsize(uchar s)} {return_type void + } { + code {view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate();} {} + } + Function {textsize()} {return_type uchar + } { + code {return (view_->textsize());} {} + } + Function {topline(const char *n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {topline(int n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {visible()} {return_type int + } { + code {return (window_->visible());} {} + } + Function {w()} {return_type int + } { + code {return (window_->w());} {} + } + Function {x()} {return_type int + } { + code {return (window_->x());} {} + } + Function {y()} {return_type int + } { + code {return (window_->y());} {} + } +} diff --git a/SrcUnix/espws-2.0/HelpDialog.gif b/SrcUnix/espws-2.0/HelpDialog.gif Binary files differnew file mode 100644 index 0000000..e0f3cbf --- /dev/null +++ b/SrcUnix/espws-2.0/HelpDialog.gif diff --git a/SrcUnix/espws-2.0/HelpDialog.h b/SrcUnix/espws-2.0/HelpDialog.h new file mode 100644 index 0000000..bc6426e --- /dev/null +++ b/SrcUnix/espws-2.0/HelpDialog.h @@ -0,0 +1,53 @@ +// generated by Fast Light User Interface Designer (fluid) version 1.0008 + +#ifndef HelpDialog_h +#define HelpDialog_h +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <string.h> +#include "HelpView.h" +#include <FL/Fl_Button.H> + +class HelpDialog { + int index_; + int max_; + int line_[100]; + char file_[100][256]; +public: + HelpDialog(); +private: + Fl_Window *window_; + HelpView *view_; + inline void cb_view__i(HelpView*, void*); + static void cb_view_(HelpView*, void*); + inline void cb_Close_i(Fl_Button*, void*); + static void cb_Close(Fl_Button*, void*); + Fl_Button *back_; + inline void cb_back__i(Fl_Button*, void*); + static void cb_back_(Fl_Button*, void*); + Fl_Button *forward_; + inline void cb_forward__i(Fl_Button*, void*); + static void cb_forward_(Fl_Button*, void*); + Fl_Button *smaller_; + inline void cb_smaller__i(Fl_Button*, void*); + static void cb_smaller_(Fl_Button*, void*); + Fl_Button *larger_; + inline void cb_larger__i(Fl_Button*, void*); + static void cb_larger_(Fl_Button*, void*); +public: + int h(); + void hide(); + void load(const char *f); + void position(int xx, int yy); + void resize(int xx, int yy, int ww, int hh); + void show(); + void textsize(uchar s); + uchar textsize(); + void topline(const char *n); + void topline(int n); + int visible(); + int w(); + int x(); + int y(); +}; +#endif diff --git a/SrcUnix/espws-2.0/HelpDialog.html b/SrcUnix/espws-2.0/HelpDialog.html new file mode 100644 index 0000000..dc64a96 --- /dev/null +++ b/SrcUnix/espws-2.0/HelpDialog.html @@ -0,0 +1,89 @@ +<HTML> +<HEAD> + <TITLE>HelpDialog - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class HelpDialog</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Group + | + +----<B>HelpDialog</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "HelpDialog.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>HelpDialog</CODE> widget displays a standard help dialog window +using the <CODE>HelpView</CODE> widget. + +<CENTER><IMG SRC="HelpDialog.gif"></CENTER> + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#HelpDialog.HelpDialog">HelpDialog</A> + <LI><A HREF="#HelpDialog.~HelpDialog">~HelpDialog</A> + <LI><A HREF="#HelpDialog.hide">hide</A> + <LI><A HREF="#HelpDialog.load">load</A> + <LI><A HREF="#HelpDialog.show">show</A> + <LI><A HREF="#HelpDialog.topline">topline</A> + <LI><A HREF="#HelpDialog.visible">visible</A> + +</UL> + +<H4><A NAME="HelpDialog.HelpDialog">HelpDialog()</A></H4> + +<P>The constructor creates the dialog pictured above. + +<H4><A NAME="HelpView.~HelpView">~HelpView()</A></H4> + +<P>The destructor destroys the widget and frees all memory that has been +allocated for the current file. + +<H4><A NAME="HelpDialog.hide">void hide()</A></H4> + +<P>Hides the <code>HelpDialog</code> window. + +<H4><A NAME="HelpDialog.load">void load(const char *f)</A></H4> + +<P>Loads the specified HTML file into the <CODE>HelpView</CODE> widget. +The filename can also contain a target name ("filename.html#target"). + +<H4><A NAME="HelpDialog.show">void show()</A></H4> + +<P>Shows the <code>HelpDialog</code> window. + +<H4><A NAME="HelpDialog.topline">void topline(const char *n)<BR> +void topline(int n)</A></H4> + +<P>Sets the top line in the <CODE>HelpView</CODE> widget to the named or +numbered line. + +<H4><A NAME="HelpDialog.visible">int visible()</A></H4> + +<P>Returns 1 if the <code>HelpDialog</code> window is visible. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/HelpView.cxx b/SrcUnix/espws-2.0/HelpView.cxx new file mode 100644 index 0000000..2370338 --- /dev/null +++ b/SrcUnix/espws-2.0/HelpView.cxx @@ -0,0 +1,1799 @@ +// +// "$Id: HelpView.cxx,v 1.22 2000/03/19 23:27:14 mike Exp $" +// +// Help Viewer widget routines. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outblockd in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// HelpView::add_block() - Add a text block to the list. +// HelpView::add_link() - Add a new link to the list. +// HelpView::add_target() - Add a new target to the list. +// HelpView::compare_targets() - Compare two targets. +// HelpView::do_align() - Compute the alignment for a line in a block. +// HelpView::draw() - Draw the HelpView widget. +// HelpView::format() - Format the help text. +// HelpView::get_align() - Get an alignment attribute. +// HelpView::get_attr() - Get an attribute value from the string. +// HelpView::get_color() - Get an alignment attribute. +// HelpView::handle() - Handle events in the widget. +// HelpView::HelpView() - Build a HelpView widget. +// HelpView::~HelpView() - Destroy a HelpView widget. +// HelpView::load() - Load the specified file. +// HelpView::resize() - Resize the help widget. +// HelpView::topline() - Set the top line to the named target. +// HelpView::topline() - Set the top line by number. +// HelpView::value() - Set the help text directly. +// scrollbar_callback() - A callback for the scrollbar. +// + +// +// Include necessary header files... +// + +#include "HelpView.h" +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <errno.h> + +#if defined(WIN32) +# include <io.h> +# include <direct.h> +# define strcasecmp(s,t) stricmp((s), (t)) +# define strncasecmp(s,t,n) strnicmp((s), (t), (n)) +#elif defined(__EMX__) +# define strcasecmp(s,t) stricmp((s), (t)) +# define strncasecmp(s,t,n) strnicmp((s), (t), (n)) +#else +# include <unistd.h> +#endif // WIN32 + + +// +// Local functions... +// + +static void scrollbar_callback(Fl_Widget *s, void *); + + +// +// 'HelpView::add_block()' - Add a text block to the list. +// + +HelpBlock * // O - Pointer to new block +HelpView::add_block(const char *s, // I - Pointer to start of block text + int xx, // I - X position of block + int yy, // I - Y position of block + int ww, // I - Right margin of block + int hh, // I - Height of block + uchar border) // I - Draw border? +{ + HelpBlock *temp; // New block + + + if (nblocks_ >= ablocks_) + { + ablocks_ += 16; + + if (ablocks_ == 16) + blocks_ = (HelpBlock *)malloc(sizeof(HelpBlock) * ablocks_); + else + blocks_ = (HelpBlock *)realloc(blocks_, sizeof(HelpBlock) * ablocks_); + } + + temp = blocks_ + nblocks_; + temp->start = s; + temp->x = xx; + temp->y = yy; + temp->w = ww; + temp->h = hh; + temp->border = border; + nblocks_ ++; + + return (temp); +} + + +// +// 'HelpView::add_link()' - Add a new link to the list. +// + +void +HelpView::add_link(const char *n, // I - Name of link + int xx, // I - X position of link + int yy, // I - Y position of link + int ww, // I - Width of link text + int hh) // I - Height of link text +{ + HelpLink *temp; // New link + char *target; // Pointer to target name + + + if (nlinks_ >= alinks_) + { + alinks_ += 16; + + if (alinks_ == 16) + links_ = (HelpLink *)malloc(sizeof(HelpLink) * alinks_); + else + links_ = (HelpLink *)realloc(links_, sizeof(HelpLink) * alinks_); + } + + temp = links_ + nlinks_; + + temp->x = xx; + temp->y = yy; + temp->w = xx + ww; + temp->h = yy + hh; + + strncpy(temp->filename, n, sizeof(temp->filename)); + temp->filename[sizeof(temp->filename) - 1] = '\0'; + + if ((target = strrchr(temp->filename, '#')) != NULL) + { + *target++ = '\0'; + strncpy(temp->name, target, sizeof(temp->name)); + temp->name[sizeof(temp->name) - 1] = '\0'; + } + else + temp->name[0] = '\0'; + + nlinks_ ++; +} + + +// +// 'HelpView::add_target()' - Add a new target to the list. +// + +void +HelpView::add_target(const char *n, // I - Name of target + int yy) // I - Y position of target +{ + HelpTarget *temp; // New target + + + if (ntargets_ >= atargets_) + { + atargets_ += 16; + + if (atargets_ == 16) + targets_ = (HelpTarget *)malloc(sizeof(HelpTarget) * atargets_); + else + targets_ = (HelpTarget *)realloc(targets_, sizeof(HelpTarget) * atargets_); + } + + temp = targets_ + ntargets_; + + temp->y = yy; + strncpy(temp->name, n, sizeof(temp->name)); + temp->name[sizeof(temp->name) - 1] = '\0'; + + ntargets_ ++; +} + + +// +// 'HelpView::compare_targets()' - Compare two targets. +// + +int // O - Result of comparison +HelpView::compare_targets(const HelpTarget *t0, // I - First target + const HelpTarget *t1) // I - Second target +{ + return (strcasecmp(t0->name, t1->name)); +} + + +// +// 'HelpView::do_align()' - Compute the alignment for a line in a block. +// + +int // O - New line +HelpView::do_align(HelpBlock *block, // I - Block to add to + int line, // I - Current line + int xx, // I - Current X position + int a, // I - Current alignment + int &l) // IO - Starting link +{ + int offset; // Alignment offset + + + switch (a) + { + case RIGHT : // Right align + offset = block->w - xx; + break; + case CENTER : // Center + offset = (block->w - xx) / 2; + break; + case LEFT : // Left align + offset = 0; + break; + } + + block->line[line] = block->x + offset; + + if (line < 31) + line ++; + + while (l < nlinks_) + { + links_[l].x += offset; + links_[l].w += offset; + l ++; + } + + return (line); +} + + +// +// 'HelpView::draw()' - Draw the HelpView widget. +// + +void +HelpView::draw() +{ + int i; // Looping var + const HelpBlock *block; // Pointer to current block + const char *ptr, // Pointer to text in block + *attrs; // Pointer to start of element attributes + char *s, // Pointer into buffer + buf[1024], // Text buffer + attr[1024]; // Attribute buffer + int xx, yy, ww, hh; // Current positions and sizes + int line; // Current line + uchar font, size; // Current font and size + int head, pre, // Flags for text + needspace; // Do we need whitespace? + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + // Box to draw... + Fl_Color tc, c; // Table/cell background color + + + // Draw the scrollbar and box first... + if (scrollbar_.visible()) + { + draw_child(scrollbar_); + draw_box(b, x(), y(), w() - 17, h(), bgcolor_); + } + else + draw_box(b, x(), y(), w(), h(), bgcolor_); + + if (!value_) + return; + + // Clip the drawing to the inside of the box... + fl_push_clip(x() + 4, y() + 4, w() - 28, h() - 8); + fl_color(textcolor_); + + tc = c = bgcolor_; + + // Draw all visible blocks... + for (i = 0, block = blocks_; i < nblocks_ && (block->y - topline_) < h(); i ++, block ++) + if ((block->y + block->h) >= topline_) + { + line = 0; + xx = block->line[line]; + yy = block->y - topline_; + hh = 0; + pre = 0; + head = 0; + needspace = 0; + + initfont(font, size); + + for (ptr = block->start, s = buf; ptr < block->end;) + { + if ((*ptr == '<' || isspace(*ptr)) && s > buf) + { + if (!head && !pre) + { + // Check width... + *s = '\0'; + s = buf; + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + + fl_draw(buf, xx + x(), yy + y()); + + xx += ww; + if ((size + 2) > hh) + hh = size + 2; + + needspace = 0; + } + else if (pre) + { + while (isspace(*ptr)) + { + if (*ptr == '\n') + { + *s = '\0'; + s = buf; + + fl_draw(buf, xx + x(), yy + y()); + + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = size + 2; + } + else if (*ptr == '\t') + { + // Do tabs every 8 columns... + while (((s - buf) & 7)) + *s++ = ' '; + } + else + *s++ = ' '; + + if ((size + 2) > hh) + hh = size + 2; + + ptr ++; + } + + if (s > buf) + { + *s = '\0'; + s = buf; + + fl_draw(buf, xx + x(), yy + y()); + xx += (int)fl_width(buf); + } + + needspace = 0; + } + else + { + s = buf; + + while (isspace(*ptr)) + ptr ++; + } + } + + if (*ptr == '<') + { + ptr ++; + while (*ptr && *ptr != '>' && !isspace(*ptr)) + if (s < (buf + sizeof(buf) - 1)) + *s++ = *ptr++; + else + ptr ++; + + *s = '\0'; + s = buf; + + attrs = ptr; + while (*ptr && *ptr != '>') + ptr ++; + + if (*ptr == '>') + ptr ++; + + if (strcasecmp(buf, "HEAD") == 0) + head = 1; + else if (strcasecmp(buf, "BR") == 0) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + else if (strcasecmp(buf, "HR") == 0) + { + fl_line(block->x + x(), yy + y(), block->w + x(), + yy + y()); + + if (line < 31) + line ++; + xx = block->line[line]; + yy += 2 * hh; + hh = 0; + } + else if (strcasecmp(buf, "CENTER") == 0 || + strcasecmp(buf, "P") == 0 || + strcasecmp(buf, "H1") == 0 || + strcasecmp(buf, "H2") == 0 || + strcasecmp(buf, "H3") == 0 || + strcasecmp(buf, "H4") == 0 || + strcasecmp(buf, "H5") == 0 || + strcasecmp(buf, "H6") == 0 || + strcasecmp(buf, "UL") == 0 || + strcasecmp(buf, "OL") == 0 || + strcasecmp(buf, "DL") == 0 || + strcasecmp(buf, "LI") == 0 || + strcasecmp(buf, "DD") == 0 || + strcasecmp(buf, "DT") == 0 || + strcasecmp(buf, "PRE") == 0) + { + if (tolower(buf[0]) == 'h') + { + font = FL_HELVETICA_BOLD; + size = textsize_ + '7' - buf[1]; + } + else if (strcasecmp(buf, "DT") == 0) + { + font = textfont_ | FL_ITALIC; + size = textsize_; + } + else if (strcasecmp(buf, "PRE") == 0) + { + font = FL_COURIER; + size = textsize_; + pre = 1; + } + + if (strcasecmp(buf, "LI") == 0) + { + fl_font(FL_SYMBOL, size); + fl_draw("\267", xx - size + x(), yy + y()); + } + + pushfont(font, size); + + if (c != bgcolor_) + { + fl_color(c); + fl_rectf(block->x + x() - 4, + block->y - topline_ + y() - size - 3, + block->w - block->x + 7, block->h + size - 5); + fl_color(textcolor_); + } + } + else if (strcasecmp(buf, "A") == 0 && + get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL) + fl_color(linkcolor_); + else if (strcasecmp(buf, "/A") == 0) + fl_color(textcolor_); + else if (strcasecmp(buf, "B") == 0) + pushfont(font |= FL_BOLD, size); + else if (strcasecmp(buf, "TABLE") == 0) + tc = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), bgcolor_); + else if (strcasecmp(buf, "TD") == 0 || + strcasecmp(buf, "TH") == 0) + { + if (tolower(buf[1]) == 'h') + pushfont(font |= FL_BOLD, size); + else + pushfont(font = textfont_, size); + + c = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), tc); + + if (c != bgcolor_) + { + fl_color(c); + fl_rectf(block->x + x() - 4, + block->y - topline_ + y() - size - 3, + block->w - block->x + 7, block->h + size - 5); + fl_color(textcolor_); + } + + if (block->border) + fl_rect(block->x + x() - 4, + block->y - topline_ + y() - size - 3, + block->w - block->x + 7, block->h + size - 5); + } + else if (strcasecmp(buf, "I") == 0) + pushfont(font |= FL_ITALIC, size); + else if (strcasecmp(buf, "CODE") == 0) + pushfont(font = FL_COURIER, size); + else if (strcasecmp(buf, "KBD") == 0) + pushfont(font = FL_COURIER_BOLD, size); + else if (strcasecmp(buf, "VAR") == 0) + pushfont(font = FL_COURIER_ITALIC, size); + else if (strcasecmp(buf, "/HEAD") == 0) + head = 0; + else if (strcasecmp(buf, "/H1") == 0 || + strcasecmp(buf, "/H2") == 0 || + strcasecmp(buf, "/H3") == 0 || + strcasecmp(buf, "/H4") == 0 || + strcasecmp(buf, "/H5") == 0 || + strcasecmp(buf, "/H6") == 0 || + strcasecmp(buf, "/B") == 0 || + strcasecmp(buf, "/I") == 0 || + strcasecmp(buf, "/CODE") == 0 || + strcasecmp(buf, "/KBD") == 0 || + strcasecmp(buf, "/VAR") == 0) + popfont(font, size); + else if (strcasecmp(buf, "/TABLE") == 0) + tc = c = bgcolor_; + else if (strcasecmp(buf, "/TD") == 0 || + strcasecmp(buf, "/TH") == 0) + c = tc; + else if (strcasecmp(buf, "/PRE") == 0) + { + popfont(font, size); + pre = 0; + } + } + else if (strcasecmp(buf, "IMG") == 0 && + get_attr(attrs, "ALT", attr, sizeof(attr)) != NULL) + { + // Show alt text... + sprintf(buf, "[%s]", attr); + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + + fl_draw(buf, xx + x(), yy + y()); + + xx += ww; + if ((size + 2) > hh) + hh = size + 2; + + needspace = 0; + } + else if (*ptr == '\n' && pre) + { + *s = '\0'; + s = buf; + + fl_draw(buf, xx + x(), yy + y()); + + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = size + 2; + needspace = 0; + + ptr ++; + } + else if (isspace(*ptr)) + { + if (pre) + { + if (*ptr == ' ') + *s++ = ' '; + else + { + // Do tabs every 8 columns... + while (((s - buf) & 7)) + *s++ = ' '; + } + } + + ptr ++; + needspace = 1; + } + else if (*ptr == '&') + { + ptr ++; + + if (strncasecmp(ptr, "amp;", 4) == 0) + { + *s++ = '&'; + ptr += 4; + } + else if (strncasecmp(ptr, "lt;", 3) == 0) + { + *s++ = '<'; + ptr += 3; + } + else if (strncasecmp(ptr, "gt;", 3) == 0) + { + *s++ = '>'; + ptr += 3; + } + else if (strncasecmp(ptr, "nbsp;", 5) == 0) + { + *s++ = ' '; + ptr += 5; + } + else if (strncasecmp(ptr, "copy;", 5) == 0) + { + *s++ = '\251'; + ptr += 5; + } + else if (strncasecmp(ptr, "reg;", 4) == 0) + { + *s++ = '\256'; + ptr += 4; + } + else if (strncasecmp(ptr, "quot;", 5) == 0) + { + *s++ = '\"'; + ptr += 5; + } + + if ((size + 2) > hh) + hh = size + 2; + } + else + { + *s++ = *ptr++; + + if ((size + 2) > hh) + hh = size + 2; + } + } + + *s = '\0'; + + if (s > buf && !pre && !head) + { + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + } + + if (s > buf && !head) + fl_draw(buf, xx + x(), yy + y()); + } + + fl_pop_clip(); +} + + +// +// 'HelpView::format()' - Format the help text. +// + +void +HelpView::format() +{ + HelpBlock *block, // Current block + *cell; // Current table cell + int row; // Current table row (block number) + const char *ptr, // Pointer into block + *start, // Pointer to start of element + *attrs; // Pointer to start of element attributes + char *s, // Pointer into buffer + buf[1024], // Text buffer + attr[1024], // Attribute buffer + link[1024]; // Link destination + int xx, yy, ww, hh; // Size of current text fragment + int line; // Current line in block + int links; // Links for current line + uchar font, size; // Current font and size + uchar border; // Draw border? + int align, // Current alignment + head, // In the <HEAD> section? + pre, // <PRE> text? + needspace; // Do we need whitespace? + int table_width; // Width of table + int column, // Current table column number + columns[200]; // Column widths + + + nblocks_ = 0; + nlinks_ = 0; + ntargets_ = 0; + size_ = 0; + bgcolor_ = color(); + textcolor_ = textcolor(); + linkcolor_ = selection_color(); + + strcpy(title_, "Untitled"); + + if (!value_) + return; + + initfont(font, size); + + line = 0; + links = 0; + xx = 4; + yy = size + 2; + hh = 0; + block = add_block(value_, xx, yy, w() - 24, 0); + row = 0; + head = 0; + pre = 0; + align = LEFT; + needspace = 0; + link[0] = '\0'; + + for (ptr = value_, s = buf; *ptr;) + { + if ((*ptr == '<' || isspace(*ptr)) && s > buf) + { + if (!head && !pre) + { + // Check width... + *s = '\0'; + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + ww += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + line = do_align(block, line, xx, align, links); + xx = block->x; + yy += hh; + block->h += hh; + hh = 0; + } + + if (link[0]) + add_link(link, xx, yy - size, ww, size); + + xx += ww; + if ((size + 2) > hh) + hh = size + 2; + + needspace = 0; + } + else if (pre) + { + // Handle preformatted text... + while (isspace(*ptr)) + { + if (*ptr == '\n') + { + if (link[0]) + add_link(link, xx, yy - hh, ww, hh); + + line = do_align(block, line, xx, align, links); + xx = block->x; + yy += hh; + block->h += hh; + hh = size + 2; + } + + if ((size + 2) > hh) + hh = size + 2; + + ptr ++; + } + + needspace = 0; + } + else + { + // Handle normal text or stuff in the <HEAD> section... + while (isspace(*ptr)) + ptr ++; + } + + s = buf; + } + + if (*ptr == '<') + { + start = ptr; + ptr ++; + while (*ptr && *ptr != '>' && !isspace(*ptr)) + if (s < (buf + sizeof(buf) - 1)) + *s++ = *ptr++; + else + ptr ++; + + *s = '\0'; + s = buf; + + attrs = ptr; + while (*ptr && *ptr != '>') + ptr ++; + + if (*ptr == '>') + ptr ++; + + if (strcasecmp(buf, "HEAD") == 0) + head = 1; + else if (strcasecmp(buf, "/HEAD") == 0) + head = 0; + else if (strcasecmp(buf, "TITLE") == 0) + { + // Copy the title in the document... + for (s = title_; + *ptr != '<' && *ptr && s < (title_ + sizeof(title_) - 1); + *s++ = *ptr++); + + *s = '\0'; + s = buf; + } + else if (strcasecmp(buf, "A") == 0) + { + if (get_attr(attrs, "NAME", attr, sizeof(attr)) != NULL) + add_target(attr, yy - size - 2); + else if (get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL) + { + strncpy(link, attr, sizeof(link) - 1); + link[sizeof(link) - 1] = '\0'; + } + } + else if (strcasecmp(buf, "/A") == 0) + link[0] = '\0'; + else if (strcasecmp(buf, "BODY") == 0) + { + bgcolor_ = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), + color()); + textcolor_ = get_color(get_attr(attrs, "TEXT", attr, sizeof(attr)), + textcolor()); + linkcolor_ = get_color(get_attr(attrs, "LINK", attr, sizeof(attr)), + selection_color()); + } + else if (strcasecmp(buf, "BR") == 0) + { + line = do_align(block, line, xx, align, links); + xx = block->x; + block->h += hh; + yy += hh; + hh = 0; + } + else if (strcasecmp(buf, "CENTER") == 0 || + strcasecmp(buf, "P") == 0 || + strcasecmp(buf, "H1") == 0 || + strcasecmp(buf, "H2") == 0 || + strcasecmp(buf, "H3") == 0 || + strcasecmp(buf, "H4") == 0 || + strcasecmp(buf, "H5") == 0 || + strcasecmp(buf, "H6") == 0 || + strcasecmp(buf, "UL") == 0 || + strcasecmp(buf, "OL") == 0 || + strcasecmp(buf, "DL") == 0 || + strcasecmp(buf, "LI") == 0 || + strcasecmp(buf, "DD") == 0 || + strcasecmp(buf, "DT") == 0 || + strcasecmp(buf, "HR") == 0 || + strcasecmp(buf, "PRE") == 0 || + strcasecmp(buf, "TABLE") == 0) + { + block->end = start; + line = do_align(block, line, xx, align, links); + xx = block->x; + block->h += hh; + + if (!block->h && nblocks_ > 1) + { + nblocks_ --; + block --; + } + + if (strcasecmp(buf, "UL") == 0 || + strcasecmp(buf, "OL") == 0 || + strcasecmp(buf, "DL") == 0) + { + xx += 4 * size; + block->h += size + 2; + } + else if (strcasecmp(buf, "TABLE") == 0) + { + if (get_attr(attrs, "BORDER", attr, sizeof(attr))) + border = atoi(attr); + else + border = 0; + + block->h += size + 2; + + if (get_attr(attrs, "WIDTH", attr, sizeof(attr))) + { + if (attr[strlen(attr) - 1] == '%') + table_width = atoi(attr) * w() / 100; + else + table_width = atoi(attr); + } + else + table_width = w(); + + for (column = 0; column < 200; column ++) + columns[column] = table_width / 3; + + column = 0; + } + + if (tolower(buf[0]) == 'h' && isdigit(buf[1])) + { + font = FL_HELVETICA_BOLD; + size = textsize_ + '7' - buf[1]; + } + else if (strcasecmp(buf, "DT") == 0) + { + font = textfont_ | FL_ITALIC; + size = textsize_; + } + else if (strcasecmp(buf, "PRE") == 0) + { + font = FL_COURIER; + size = textsize_; + pre = 1; + } + else + { + font = textfont_; + size = textsize_; + } + + pushfont(font, size); + + yy = block->y + block->h; + hh = 0; + + if ((tolower(buf[0]) == 'h' && isdigit(buf[1])) || + strcasecmp(buf, "DD") == 0 || + strcasecmp(buf, "DT") == 0 || + strcasecmp(buf, "UL") == 0 || + strcasecmp(buf, "OL") == 0 || + strcasecmp(buf, "P") == 0) + yy += size + 2; + else if (strcasecmp(buf, "HR") == 0) + { + hh += 2 * size; + yy += size; + } + + if (row) + block = add_block(start, block->x, yy, block->w, 0); + else + block = add_block(start, xx, yy, w() - 24, 0); + + needspace = 0; + line = 0; + + if (strcasecmp(buf, "CENTER") == 0) + align = CENTER; + else + align = get_align(attrs, LEFT); + } + else if (strcasecmp(buf, "/P") == 0 || + strcasecmp(buf, "/H1") == 0 || + strcasecmp(buf, "/H2") == 0 || + strcasecmp(buf, "/H3") == 0 || + strcasecmp(buf, "/H4") == 0 || + strcasecmp(buf, "/H5") == 0 || + strcasecmp(buf, "/H6") == 0 || + strcasecmp(buf, "/PRE") == 0 || + strcasecmp(buf, "/UL") == 0 || + strcasecmp(buf, "/OL") == 0 || + strcasecmp(buf, "/DL") == 0 || + strcasecmp(buf, "/TABLE") == 0) + { + line = do_align(block, line, xx, align, links); + xx = block->x; + block->end = ptr; + + if (strcasecmp(buf, "/UL") == 0 || + strcasecmp(buf, "/OL") == 0 || + strcasecmp(buf, "/DL") == 0) + { + xx -= 4 * size; + block->h += size + 2; + } + else if (strcasecmp(buf, "/TABLE") == 0) + block->h += size + 2; + else if (strcasecmp(buf, "/PRE") == 0) + { + pre = 0; + hh = 0; + } + + initfont(font, size); + + while (isspace(*ptr)) + ptr ++; + + block->h += hh; + yy += hh; + + if (tolower(buf[2]) == 'l') + yy += size + 2; + + block = add_block(ptr, xx, yy, w() - 24, 0); + needspace = 0; + hh = 0; + line = 0; + align = LEFT; + } + else if (strcasecmp(buf, "TR") == 0) + { + block->end = start; + line = do_align(block, line, xx, align, links); + xx = block->x; + block->h += hh; + + if (row) + { + yy = blocks_[row].y + blocks_[row].h; + + for (cell = blocks_ + row + 1; cell <= block; cell ++) + if ((cell->y + cell->h) > yy) + yy = cell->y + cell->h; + + block->h = yy - block->y + 2; + + for (cell = blocks_ + row + 1; cell < block; cell ++) + cell->h = block->h; + } + + yy = block->y + block->h - 4; + hh = 0; + block = add_block(start, xx, yy, w() - 24, 0); + row = block - blocks_; + needspace = 0; + column = 0; + line = 0; + } + else if (strcasecmp(buf, "/TR") == 0 && row) + { + line = do_align(block, line, xx, align, links); + block->end = start; + block->h += hh; + + xx = blocks_[row].x; + + if (block->end == block->start && nblocks_ > 1) + { + nblocks_ --; + block --; + } + + yy = blocks_[row].y + blocks_[row].h; + + for (cell = blocks_ + row + 1; cell <= block; cell ++) + if ((cell->y + cell->h) > yy) + yy = cell->y + cell->h; + + block->h = yy - block->y + 2; + + for (cell = blocks_ + row + 1; cell < block; cell ++) + cell->h = block->h; + + yy = block->y + block->h - 4; + block = add_block(start, xx, yy, w() - 24, 0); + needspace = 0; + row = 0; + line = 0; + } + else if ((strcasecmp(buf, "TD") == 0 || + strcasecmp(buf, "TH") == 0) && row) + { + line = do_align(block, line, xx, align, links); + block->end = start; + block->h += hh; + + if (strcasecmp(buf, "TH") == 0) + font = textfont_ | FL_BOLD; + else + font = textfont_; + + size = textsize_; + + if (column == 0) + xx = block->x + size + 3; + else + xx = block->w + 6; + + if (block->end == block->start && nblocks_ > 1) + { + nblocks_ --; + block --; + } + + pushfont(font, size); + + if (get_attr(attrs, "WIDTH", attr, sizeof(attr)) != NULL) + { + ww = atoi(attr); + + if (attr[strlen(attr) - 1] == '%') + ww = ww * w() / 100; + + columns[column] = ww; + } + else + ww = columns[column]; + + yy = blocks_[row].y; + hh = 0; + block = add_block(start, xx, yy, xx + ww, 0, border); + needspace = 0; + line = 0; + + align = get_align(attrs, tolower(buf[1]) == 'h' ? CENTER : LEFT); + + column ++; + } + else if ((strcasecmp(buf, "/TD") == 0 || + strcasecmp(buf, "/TH") == 0) && row) + popfont(font, size); + else if (strcasecmp(buf, "B") == 0) + pushfont(font |= FL_BOLD, size); + else if (strcasecmp(buf, "I") == 0) + pushfont(font |= FL_ITALIC, size); + else if (strcasecmp(buf, "CODE") == 0) + pushfont(font = FL_COURIER, size); + else if (strcasecmp(buf, "KBD") == 0) + pushfont(font = FL_COURIER_BOLD, size); + else if (strcasecmp(buf, "VAR") == 0) + pushfont(font = FL_COURIER_ITALIC, size); + else if (strcasecmp(buf, "/B") == 0 || + strcasecmp(buf, "/I") == 0 || + strcasecmp(buf, "/CODE") == 0 || + strcasecmp(buf, "/KBD") == 0 || + strcasecmp(buf, "/VAR") == 0) + popfont(font, size); + } + else if (strcasecmp(buf, "IMG") == 0 && + get_attr(attrs, "ALT", attr, sizeof(attr)) != NULL) + { + // Show alt text... + ww = (int)(fl_width(attr) + fl_width('[') + fl_width(']')); + + if (needspace && xx > block->x) + ww += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + line = do_align(block, line, xx, align, links); + xx = block->x; + yy += hh; + block->h += hh; + hh = 0; + } + + if (link[0]) + add_link(link, xx, yy - size, ww, size); + + xx += ww; + if ((size + 2) > hh) + hh = size + 2; + + needspace = 0; + } + else if (*ptr == '\n' && pre) + { + if (link[0]) + add_link(link, xx, yy - hh, ww, hh); + + line = do_align(block, line, xx, align, links); + xx = block->x; + yy += hh; + block->h += hh; + needspace = 0; + ptr ++; + } + else if (isspace(*ptr)) + { + needspace = 1; + + ptr ++; + } + else if (*ptr == '&' && s < (buf + sizeof(buf) - 1)) + { + ptr ++; + + if (strncasecmp(ptr, "amp;", 4) == 0) + { + *s++ = '&'; + ptr += 4; + } + else if (strncasecmp(ptr, "lt;", 3) == 0) + { + *s++ = '<'; + ptr += 3; + } + else if (strncasecmp(ptr, "gt;", 3) == 0) + { + *s++ = '>'; + ptr += 3; + } + else if (strncasecmp(ptr, "nbsp;", 5) == 0) + { + *s++ = '\240'; + ptr += 5; + } + else if (strncasecmp(ptr, "copy;", 5) == 0) + { + *s++ = '\251'; + ptr += 5; + } + else if (strncasecmp(ptr, "reg;", 4) == 0) + { + *s++ = '\256'; + ptr += 4; + } + else if (strncasecmp(ptr, "quot;", 5) == 0) + { + *s++ = '\"'; + ptr += 5; + } + + if ((size + 2) > hh) + hh = size + 2; + } + else + { + if (s < (buf + sizeof(buf) - 1)) + *s++ = *ptr++; + else + ptr ++; + + if ((size + 2) > hh) + hh = size + 2; + } + } + + if (s > buf && !pre && !head) + { + *s = '\0'; + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + ww += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + line = do_align(block, line, xx, align, links); + xx = block->x; + yy += hh; + block->h += hh; + hh = 0; + } + + if (link[0]) + add_link(link, xx, yy - size, ww, size); + + xx += ww; + if ((size + 2) > hh) + hh = size + 2; + + needspace = 0; + } + + block->end = ptr; + size_ = yy + hh; + + if (ntargets_ > 1) + qsort(targets_, ntargets_, sizeof(HelpTarget), + (int (*)(const void *, const void *))compare_targets); + + if (size_ < (h() - 8)) + scrollbar_.hide(); + else + scrollbar_.show(); + + topline(topline_); +} + + +// +// 'HelpView::get_align()' - Get an alignment attribute. +// + +int // O - Alignment +HelpView::get_align(const char *p, // I - Pointer to start of attrs + int a) // I - Default alignment +{ + char buf[255]; // Alignment value + + + if (get_attr(p, "ALIGN", buf, sizeof(buf)) == NULL) + return (a); + + if (strcasecmp(buf, "CENTER") == 0) + return (CENTER); + else if (strcasecmp(buf, "RIGHT") == 0) + return (RIGHT); + else + return (LEFT); +} + + +// +// 'HelpView::get_attr()' - Get an attribute value from the string. +// + +const char * // O - Pointer to buf or NULL +HelpView::get_attr(const char *p, // I - Pointer to start of attributes + const char *n, // I - Name of attribute + char *buf, // O - Buffer for attribute value + int bufsize) // I - Size of buffer +{ + char name[255], // Name from string + *ptr, // Pointer into name or value + quote; // Quote + + + while (*p && *p != '>') + { + while (isspace(*p)) + p ++; + + if (*p == '>' || !*p) + return (NULL); + + for (ptr = name; *p && !isspace(*p) && *p != '=' && *p != '>';) + if (ptr < (name + sizeof(name) - 1)) + *ptr++ = *p++; + else + p ++; + + *ptr = '\0'; + + if (isspace(*p) || !*p || *p == '>') + buf[0] = '\0'; + else + { + if (*p == '=') + p ++; + + for (ptr = buf; *p && !isspace(*p) && *p != '>';) + if (*p == '\'' || *p == '\"') + { + quote = *p++; + + while (*p && *p != quote) + if ((ptr - buf + 1) < bufsize) + *ptr++ = *p++; + else + p ++; + + if (*p == quote) + p ++; + } + else if ((ptr - buf + 1) < bufsize) + *ptr++ = *p++; + else + p ++; + + *ptr = '\0'; + } + + if (strcasecmp(n, name) == 0) + return (buf); + + if (*p == '>') + return (NULL); + } + + return (NULL); +} + + +// +// 'HelpView::get_color()' - Get an alignment attribute. +// + +Fl_Color // O - Color value +HelpView::get_color(const char *n, // I - Color name + Fl_Color c) // I - Default color value +{ + int rgb, r, g, b; // RGB values + + + if (!n) + return (c); + + if (n[0] == '#') + { + // Do hex color lookup + rgb = strtol(n + 1, NULL, 16); + + r = rgb >> 16; + g = (rgb >> 8) & 255; + b = rgb & 255; + + if (r == g && g == b) + return (fl_gray_ramp(FL_NUM_GRAY * r / 256)); + else + return (fl_color_cube((FL_NUM_RED - 1) * r / 255, + (FL_NUM_GREEN - 1) * g / 255, + (FL_NUM_BLUE - 1) * b / 255)); + } + else if (strcasecmp(n, "black") == 0) + return (FL_BLACK); + else if (strcasecmp(n, "red") == 0) + return (FL_RED); + else if (strcasecmp(n, "green") == 0) + return (fl_color_cube(0, 4, 0)); + else if (strcasecmp(n, "yellow") == 0) + return (FL_YELLOW); + else if (strcasecmp(n, "blue") == 0) + return (FL_BLUE); + else if (strcasecmp(n, "magenta") == 0 || strcasecmp(n, "fuchsia") == 0) + return (FL_MAGENTA); + else if (strcasecmp(n, "cyan") == 0 || strcasecmp(n, "aqua") == 0) + return (FL_CYAN); + else if (strcasecmp(n, "white") == 0) + return (FL_WHITE); + else if (strcasecmp(n, "gray") == 0 || strcasecmp(n, "grey") == 0) + return (FL_GRAY); + else if (strcasecmp(n, "lime") == 0) + return (FL_GREEN); + else if (strcasecmp(n, "maroon") == 0) + return (fl_color_cube(2, 0, 0)); + else if (strcasecmp(n, "navy") == 0) + return (fl_color_cube(0, 0, 2)); + else if (strcasecmp(n, "olive") == 0) + return (fl_color_cube(2, 4, 0)); + else if (strcasecmp(n, "purple") == 0) + return (fl_color_cube(2, 0, 2)); + else if (strcasecmp(n, "silver") == 0) + return (FL_LIGHT2); + else if (strcasecmp(n, "teal") == 0) + return (fl_color_cube(0, 4, 2)); + else + return (c); +} + + +// +// 'HelpView::handle()' - Handle events in the widget. +// + +int // O - 1 if we handled it, 0 otherwise +HelpView::handle(int event) // I - Event to handle +{ + int i; // Looping var + int xx, yy; // Adjusted mouse position + HelpLink *link; // Current link + char target[32]; // Current target + + + switch (event) + { + case FL_MOVE : + case FL_PUSH : + xx = Fl::event_x() - x(); + yy = Fl::event_y() - y() + topline_; + if (!scrollbar_.visible() || xx < (w() - 20)) + break; + + default : + // Use the Fl_Group handler... + return (Fl_Group::handle(event)); + } + + // Handle mouse clicks on links... + for (i = nlinks_, link = links_; i > 0; i --, link ++) + if (xx >= link->x && xx < link->w && + yy >= link->y && yy < link->h) + break; + + if (!i) + { + fl_cursor(FL_CURSOR_DEFAULT); + return (1); + } + + // Change the cursor for FL_MOTION events, and go to the link for + // clicks... + if (event == FL_MOVE) + fl_cursor(FL_CURSOR_HAND); + else + { + fl_cursor(FL_CURSOR_DEFAULT); + + strncpy(target, link->name, sizeof(target) - 1); + target[sizeof(target) - 1] = '\0'; + + set_changed(); + + if (strcmp(link->filename, filename_) != 0 && link->filename[0]) + { + char dir[1024]; // Current directory + char temp[1024]; // Temporary filename + + + if (link->filename[0] != '/' && strchr(link->filename, ':') == NULL) + { + if (directory_[0]) + sprintf(temp, "%s/%s", directory_, link->filename); + else + { + getcwd(dir, sizeof(dir)); + sprintf(temp, "file:%s/%s", dir, link->filename); + } + + load(temp); + } + else + load(link->filename); + } + else if (target[0]) + topline(target); + else + topline(0); + } + + return (1); +} + + +// +// 'HelpView::HelpView()' - Build a HelpView widget. +// + +HelpView::HelpView(int xx, // I - Left position + int yy, // I - Top position + int ww, // I - Width in pixels + int hh, // I - Height in pixels + const char *l) + : Fl_Group(xx, yy, ww, hh, l), + scrollbar_(xx + ww - 17, yy, 17, hh) +{ + filename_[0] = '\0'; + value_ = NULL; + + ablocks_ = 0; + nblocks_ = 0; + blocks_ = (HelpBlock *)0; + + alinks_ = 0; + nlinks_ = 0; + links_ = (HelpLink *)0; + + atargets_ = 0; + ntargets_ = 0; + targets_ = (HelpTarget *)0; + + nfonts_ = 0; + textfont_ = FL_TIMES; + textsize_ = 12; + + topline_ = 0; + size_ = 0; + + color(FL_WHITE); + textcolor(FL_BLACK); + selection_color(FL_BLUE); + + scrollbar_.value(0, hh, 0, 1); + scrollbar_.step(8.0); + scrollbar_.show(); + scrollbar_.callback(scrollbar_callback); + + end(); +} + + +// +// 'HelpView::~HelpView()' - Destroy a HelpView widget. +// + +HelpView::~HelpView() +{ + if (nblocks_) + free(blocks_); + if (nlinks_) + free(links_); + if (ntargets_) + free(targets_); + if (value_) + free((void *)value_); +} + + +// +// 'HelpView::load()' - Load the specified file. +// + +int // O - 0 on success, -1 on error +HelpView::load(const char *f) // I - Filename to load (may also have target) +{ + FILE *fp; // File to read from + long len; // Length of file + char *target; // Target in file + char *slash; // Directory separator + const char *localname; // Local filename + char error[1024]; // Error buffer + + + strcpy(filename_, f); + strcpy(directory_, filename_); + + if ((slash = strrchr(directory_, '/')) == NULL) + directory_[0] = '\0'; + else if (slash > directory_ && slash[-1] != '/') + *slash = '\0'; + + if ((target = strrchr(filename_, '#')) != NULL) + *target++ = '\0'; + + if (link_) + localname = (*link_)(filename_); + else + localname = filename_; + + if (localname != NULL && + (strncmp(localname, "ftp:", 4) == 0 || + strncmp(localname, "http:", 5) == 0 || + strncmp(localname, "https:", 6) == 0 || + strncmp(localname, "ipp:", 4) == 0 || + strncmp(localname, "mailto:", 7) == 0 || + strncmp(localname, "news:", 5) == 0)) + localname = NULL; // Remote link wasn't resolved... + else if (localname != NULL && + strncmp(localname, "file:", 5) == 0) + localname += 5; // Adjust for local filename... + + if (value_ != NULL) + { + free((void *)value_); + value_ = NULL; + } + + if (localname) + { + if ((fp = fopen(localname, "rb")) != NULL) + { + fseek(fp, 0, SEEK_END); + len = ftell(fp); + rewind(fp); + + value_ = (const char *)calloc(len + 1, 1); + fread((void *)value_, 1, len, fp); + fclose(fp); + } + else + { + sprintf(error, "%s: %s\n", localname, strerror(errno)); + value_ = strdup(error); + } + } + else + value_ = strdup("File or link could not be opened.\n"); + + format(); + + if (target) + topline(target); + else + topline(0); + + return (0); +} + + +// +// 'HelpView::resize()' - Resize the help widget. +// + +void +HelpView::resize(int xx, // I - New left position + int yy, // I - New top position + int ww, // I - New width + int hh) // I - New height +{ + Fl_Widget::resize(xx, yy, ww, hh); + scrollbar_.resize(xx + ww - 17, yy, 17, hh); + + format(); +} + + +// +// 'HelpView::topline()' - Set the top line to the named target. +// + +void +HelpView::topline(const char *n) // I - Target name +{ + HelpTarget key, // Target name key + *target; // Pointer to matching target + + + if (ntargets_ == 0) + return; + + strncpy(key.name, n, sizeof(key.name) - 1); + key.name[sizeof(key.name) - 1] = '\0'; + + target = (HelpTarget *)bsearch(&key, targets_, ntargets_, sizeof(HelpTarget), + (int (*)(const void *, const void *))compare_targets); + + if (target != NULL) + topline(target->y); +} + + +// +// 'HelpView::topline()' - Set the top line by number. +// + +void +HelpView::topline(int t) // I - Top line number +{ + if (!value_) + return; + + if (size_ < (h() - 8) || t < 0) + t = 0; + else if (t > size_) + t = size_; + + topline_ = t; + + scrollbar_.value(topline_, h(), 0, size_); + + do_callback(); + clear_changed(); + + redraw(); +} + + +// +// 'HelpView::value()' - Set the help text directly. +// + +void +HelpView::value(const char *v) // I - Text to view +{ + if (!v) + return; + + if (value_ != NULL) + free((void *)value_); + + value_ = strdup(v); + + format(); + + set_changed(); + topline(0); +} + + +// +// 'scrollbar_callback()' - A callback for the scrollbar. +// + +static void +scrollbar_callback(Fl_Widget *s, void *) +{ + ((HelpView *)(s->parent()))->topline(int(((Fl_Scrollbar*)s)->value())); +} + + +// +// End of "$Id: HelpView.cxx,v 1.22 2000/03/19 23:27:14 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/HelpView.h b/SrcUnix/espws-2.0/HelpView.h new file mode 100644 index 0000000..ba327da --- /dev/null +++ b/SrcUnix/espws-2.0/HelpView.h @@ -0,0 +1,180 @@ +// +// "$Id: HelpView.h,v 1.9 2000/01/22 15:21:08 mike Exp $" +// +// Help Viewer widget definitions. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outblockd in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// + +#ifndef _GUI_HELPVIEW_H_ +# define _GUI_HELPVIEW_H_ + +// +// Include necessary header files... +// + +# include <FL/Fl.H> +# include <FL/Fl_Group.H> +# include <FL/Fl_Scrollbar.H> +# include <FL/fl_draw.H> + + +// +// HelpFunc type - link callback function for files... +// + + +typedef const char *(HelpFunc)(const char *); + + +// +// HelpBlock structure... +// + +struct HelpBlock +{ + const char *start, // Start of text + *end; // End of text + uchar font, // Text font + size, // Text size + border; // Draw border? + short x, // Indentation/starting X coordinate + y, // Starting Y coordinate + w, // Width + h; // Height + short line[32]; // Left starting position for each line +}; + +// +// HelpLink structure... +// + +struct HelpLink +{ + char filename[192], // Reference filename + name[32]; // Link target (blank if none) + int x, // X offset of link text + y, // Y offset of link text + w, // Width of link text + h; // Height of link text +}; + +// +// HelpTarget structure... +// + +struct HelpTarget +{ + char name[32]; // Target name + int y; // Y offset of target +}; + +// +// HelpView class... +// + +class HelpView : public Fl_Group //// Help viewer widget +{ + enum { RIGHT = -1, CENTER, LEFT }; // Alignments + + char title_[1024]; // Title string + Fl_Color defcolor_, // Default text color + bgcolor_, // Background color + textcolor_, // Text color + linkcolor_; // Link color + uchar textfont_, // Default font for text + textsize_; // Default font size + const char *value_; // HTML text value + + int nblocks_, // Number of blocks/paragraphs + ablocks_; // Allocated blocks + HelpBlock *blocks_; // Blocks + + int nfonts_; // Number of fonts in stack + uchar fonts_[100][2]; // Font stack + + HelpFunc *link_; // Link transform function + + int nlinks_, // Number of links + alinks_; // Allocated links + HelpLink *links_; // Links + + int ntargets_, // Number of targets + atargets_; // Allocated targets + HelpTarget *targets_; // Targets + + char directory_[1024]; // Directory for current file + char filename_[1024]; // Current filename + int topline_, // Top line in document + size_; // Total document length + Fl_Scrollbar scrollbar_; // Scrollbar for document + + HelpBlock *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0); + void add_link(const char *n, int xx, int yy, int ww, int hh); + void add_target(const char *n, int yy); + static int compare_targets(const HelpTarget *t0, const HelpTarget *t1); + int do_align(HelpBlock *block, int line, int xx, int a, int &l); + void draw(); + void format(); + int get_align(const char *p, int a); + const char *get_attr(const char *p, const char *n, char *buf, int bufsize); + Fl_Color get_color(const char *n, Fl_Color c); + int handle(int); + + void initfont(uchar &f, uchar &s) { nfonts_ = 0; + fl_font(f = fonts_[0][0] = textfont_, + s = fonts_[0][1] = textsize_); } + void pushfont(uchar f, uchar s) { if (nfonts_ < 99) nfonts_ ++; + fl_font(fonts_[nfonts_][0] = f, + fonts_[nfonts_][1] = s); } + void popfont(uchar &f, uchar &s) { if (nfonts_ > 0) nfonts_ --; + fl_font(f = fonts_[nfonts_][0], + s = fonts_[nfonts_][1]); } + + public: + + HelpView(int xx, int yy, int ww, int hh, const char *l = 0); + ~HelpView(); + const char *directory() const { if (directory_[0]) return (directory_); + else return ((const char *)0); } + const char *filename() const { if (filename_[0]) return (filename_); + else return ((const char *)0); } + void link(HelpFunc *fn) { link_ = fn; } + int load(const char *f); + void resize(int,int,int,int); + int size() const { return (size_); } + void textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; } + Fl_Color textcolor() const { return (defcolor_); } + void textfont(uchar f) { textfont_ = f; format(); } + uchar textfont() const { return (textfont_); } + void textsize(uchar s) { textsize_ = s; format(); } + uchar textsize() const { return (textsize_); } + const char *title() { return (title_); } + void topline(const char *n); + void topline(int); + int topline() const { return (topline_); } + void value(const char *v); + const char *value() const { return (value_); } +}; + +#endif // !_GUI_HELPVIEW_H_ + +// +// End of "$Id: HelpView.h,v 1.9 2000/01/22 15:21:08 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/HelpView.html b/SrcUnix/espws-2.0/HelpView.html new file mode 100644 index 0000000..88294dc --- /dev/null +++ b/SrcUnix/espws-2.0/HelpView.html @@ -0,0 +1,130 @@ +<HTML> +<HEAD> + <TITLE>HelpView - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<!-- NEW PAGE --> +<H2>class HelpView</H2> + +<HR> + +<H3>Class Hierarchy</H3> + +<UL><PRE> +Fl_Group + | + +----<B>HelpView</B> +</PRE></UL> + +<H3>Include Files</H3> + +<UL><PRE> +#include "HelpView.h" +</PRE></UL> + +<H3>Description</H3> + +<P>The <CODE>HelpView</CODE> widget displays HTML text. Most HTML 2.0 +elements are supported, as well as a primitive implementation of tables. +Images are not currently displayed (although the ALT text is, if present.) + +<H3>Methods</H3> + +<UL> + + <LI><A HREF="#HelpView.HelpView">HelpView</A> + <LI><A HREF="#HelpView.~HelpView">~HelpView</A> + <LI><A HREF="#HelpView.directory">directory</A> + <LI><A HREF="#HelpView.filename">filename</A> + <LI><A HREF="#HelpView.link">link</A> + <LI><A HREF="#HelpView.load">load</A> + <LI><A HREF="#HelpView.size">size</A> + <LI><A HREF="#HelpView.textcolor">textcolor</A> + <LI><A HREF="#HelpView.textfont">textfont</A> + <LI><A HREF="#HelpView.textsize">textsize</A> + <LI><A HREF="#HelpView.title">title</A> + <LI><A HREF="#HelpView.topline">topline</A> + <LI><A HREF="#HelpView.value">value</A> + +</UL> + +<H4><A NAME="HelpView.HelpView">HelpView(int xx, int yy, int ww, int hh, const char *l = 0)</A></H4> + +<P>The constructor creates the <CODE>HelpView</CODE> widget at the specified +position and size. + +<H4><A NAME="HelpView.~HelpView">~HelpView()</A></H4> + +<P>The destructor destroys the widget and frees all memory that has been +allocated for the current file. + +<H4><A NAME="HelpView.directory">const char *directory() const</A></H4> + +<P>This method returns the current directory (base) path for the file +in the buffer. + +<H4><A NAME="HelpView.filename">const char *filename() const</A></H4> + +<P>This method returns the current filename for the text in the buffer. + +<H4><A NAME="HelpView.link">void link(HelpFunc *fn)</A></H4> + +<P>This method assigns a callback function to use when a link is +followed or a file is loaded (via <CODE>HelpView::load()</CODE>) that +requires a different file or path. The callback function receives the +full pathname for the file in question and must return a pathname that +can be opened as a local file. This is used by the +<A HREF="HelpApp.html"><CODE>HelpApp</CODE></A> widget to support WWW +addresses. + +<H4><A NAME="HelpView.load">int load(const char *f)</A></H4> + +<P>This method loads the specified file or URL. + +<H4><A NAME="HelpView.size">int size() const</A></H4> + +<P>This method returns the length of the buffer text in pixels. + +<H4><A NAME="HelpView.textcolor">void textcolor(Fl_Color c)<BR> +Fl_Color textcolor() const</A></H4> + +<P>The first form sets the default text color. The second returns +the current default text color. + +<H4><A NAME="HelpView.textfont">void textfont(uchar f)<BR> +uchar textfont() const</A></H4> + +<P>The first form sets the default text font. The second returns +the current default text font. + +<H4><A NAME="HelpView.textsize">void textsize(uchar s)<BR> +uchar textsize() const</A></H4> + +<P>The first form sets the default text size. The second returns +the current default text size. + +<H4><A NAME="HelpView.title">const char *title()</A></H4> + +<P>This method returns the current document title, or NULL if there +is no title. + +<H4><A NAME="HelpView.topline">void topline(const char *n)<BR> +void topline(int)<BR> +int topline() const</A></H4> + +<P>The first two forms scroll the text to the indicated position, either +with a named destination or by pixel line. + +<P>The second form returns the current top line in pixels. + +<H4><A NAME="HelpView.value">void value(const char *v)<BR> +const char *value() const</A></H4> + +<P>The first form sets the current buffer to the string provided and +reformats the text. The second form returns the current buffer contents. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/Makefile.in b/SrcUnix/espws-2.0/Makefile.in new file mode 100644 index 0000000..7fde551 --- /dev/null +++ b/SrcUnix/espws-2.0/Makefile.in @@ -0,0 +1,121 @@ +# +# Makefile for widgets and example programs. +# +# Copyright 1999-2000 by Michael Sweet. +# + +# +# Programs... +# + +AR = @AR@ +CC = @CC@ +CXX = @CXX@ +RANLIB = @RANLIB@ +RM = @RM@ -f +SHELL = /bin/sh + +# +# Program options... +# + +ARFLAGS = crvs +CFLAGS = @CFLAGS@ @DEFS@ +CXXFLAGS = @CXXFLAGS@ @DEFS@ +LIBS = @LIBS@ -lXext -lX11 +LDFLAGS = @LDFLAGS@ + +# +# Rules... +# + +.SILENT: +.SUFFIXES: .c .cxx .h .o +.c.o: + echo Compiling $<... + $(CC) $(CFLAGS) -c $< +.cxx.o: + echo Compiling $<... + $(CXX) $(CXXFLAGS) -c $< + +# +# Make all targets... +# + +all: libespws.a testfile testhelp flsurf + + +# +# Remove object and target files... +# + +clean: + $(RM) *.o + $(RM) libespws.a + $(RM) testfile + $(RM) testhelp + $(RM) flsurf + + +# +# Make the file chooser widget library. +# + +LIBOBJS = FileBrowser.o FileChooser.o FileChooser2.o FileIcon.o \ + FileInput.o Fl_Wizard.o HelpApp.o HelpApp2.o HelpDialog.o \ + HelpView.o + +libespws.a: $(LIBOBJS) + echo Building library $@... + $(RM) libespws.a + $(AR) $(ARFLAGS) libespws.a $(LIBOBJS) + $(RANLIB) libespws.a + +FileBrowser.o: FileBrowser.h FileIcon.h +FileChooser2.o: FileBrowser.h FileChooser.h FileIcon.h FileInput.h +FileChooser.o: FileBrowser.h FileChooser.h FileIcon.h FileInput.h +FileIcon.o: FileIcon.h +FileInput.o: FileInput.h +Fl_Wizard.o: Fl_Wizard.h +HelpApp.o: HelpApp.h HelpView.h +HelpApp2.o: HelpApp.h HelpView.h +HelpDialog.o: HelpDialog.h HelpView.h +HelpView.o: HelpView.h + + +# +# Make the file chooser test program. +# + +testfile: libespws.a testfile.o + echo Linking $@... + $(CXX) $(LDFLAGS) -o testfile testfile.o libespws.a $(LIBS) + +testfile.o: FileBrowser.h FileChooser.h FileIcon.h FileInput.h + + +# +# Make the help test program. +# + +testhelp: libespws.a testhelp.o + echo Linking $@... + $(CXX) $(LDFLAGS) -o testhelp testhelp.o libespws.a $(LIBS) + +testhelp.o: HelpDialog.h HelpView.h + + +# +# Make the flsurf program. +# + +flsurf: libespws.a flsurf.o + echo Linking $@... + $(CXX) $(LDFLAGS) -o flsurf flsurf.o libespws.a $(LIBS) + +flsurf.o: HelpApp.h HelpView.h + + +# +# End of Makefile. +# diff --git a/SrcUnix/espws-2.0/allfiles.xbm b/SrcUnix/espws-2.0/allfiles.xbm new file mode 100644 index 0000000..26373b6 --- /dev/null +++ b/SrcUnix/espws-2.0/allfiles.xbm @@ -0,0 +1,6 @@ +#define allfiles_width 16 +#define allfiles_height 16 +static unsigned char allfiles_bits[] = { + 0xfc, 0x3f, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x84, 0x21, 0xa4, 0x25, + 0xc4, 0x23, 0xf4, 0x2f, 0xf4, 0x2f, 0xc4, 0x23, 0xa4, 0x25, 0x84, 0x21, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0xfc, 0x3f}; diff --git a/SrcUnix/espws-2.0/configure b/SrcUnix/espws-2.0/configure new file mode 100755 index 0000000..5abc232 --- /dev/null +++ b/SrcUnix/espws-2.0/configure @@ -0,0 +1,1865 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-x use the X Window System" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=Makefile.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +uname=`uname` +if test "$uname" = "IRIX64"; then + uname="IRIX" +fi + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:536: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:566: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:617: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:649: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 660 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:665: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:691: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:696: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:705: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:724: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:760: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CXX="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CXX="$ac_cv_prog_CXX" +if test -n "$CXX"; then + echo "$ac_t""$CXX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$CXX" && break +done +test -n "$CXX" || CXX="gcc" + + +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:792: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 + +ac_ext=C +# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cxx_cross + +cat > conftest.$ac_ext << EOF + +#line 803 "configure" +#include "confdefs.h" + +int main(){return(0);} +EOF +if { (eval echo configure:808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cxx_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cxx_cross=no + else + ac_cv_prog_cxx_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cxx_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 +if test $ac_cv_prog_cxx_works = no; then + { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:834: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 +cross_compiling=$ac_cv_prog_cxx_cross + +echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 +echo "configure:839: checking whether we are using GNU C++" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.C <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:848: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gxx=yes +else + ac_cv_prog_gxx=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gxx" 1>&6 + +if test $ac_cv_prog_gxx = yes; then + GXX=yes +else + GXX= +fi + +ac_test_CXXFLAGS="${CXXFLAGS+set}" +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS= +echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 +echo "configure:867: checking whether ${CXX-g++} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.cc +if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then + ac_cv_prog_cxx_g=yes +else + ac_cv_prog_cxx_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS="$ac_save_CXXFLAGS" +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:901: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:931: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$AR" in + /*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_AR="$AR" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_AR="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +AR="$ac_cv_path_AR" +if test -n "$AR"; then + echo "$ac_t""$AR" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:966: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$RM" in + /*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_RM="$RM" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_RM="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +RM="$ac_cv_path_RM" +if test -n "$RM"; then + echo "$ac_t""$RM" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1000: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +#line 1015 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1021: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +#line 1032 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1038: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +#line 1049 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1055: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +# If we find X, set shell vars x_includes and x_libraries to the +# paths, otherwise set no_x=yes. +# Uses ac_ vars as temps to allow command line to override cache and checks. +# --without-x overrides everything else, but does not touch the cache. +echo $ac_n "checking for X""... $ac_c" 1>&6 +echo "configure:1084: checking for X" >&5 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + : +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else +if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=NO ac_x_libraries=NO +rm -fr conftestdir +if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case "$ac_im_incroot" in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; + esac + case "$ac_im_usrlibdir" in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; + esac + fi + cd .. + rm -fr conftestdir +fi + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +cat > conftest.$ac_ext <<EOF +#line 1146 "configure" +#include "confdefs.h" +#include <$x_direct_test_include> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1151: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done +fi +rm -f conftest* +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1220 "configure" +#include "confdefs.h" + +int main() { +${x_direct_test_function}() +; return 0; } +EOF +if { (eval echo configure:1227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ + /usr/X11/lib \ + /usr/X11R6/lib \ + /usr/X11R5/lib \ + /usr/X11R4/lib \ + \ + /usr/lib/X11 \ + /usr/lib/X11R6 \ + /usr/lib/X11R5 \ + /usr/lib/X11R4 \ + \ + /usr/local/X11/lib \ + /usr/local/X11R6/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R4/lib \ + \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R4 \ + \ + /usr/X386/lib \ + /usr/x386/lib \ + /usr/XFree86/lib/X11 \ + \ + /usr/lib \ + /usr/local/lib \ + /usr/unsupported/lib \ + /usr/athena/lib \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /lib/usr/lib/X11 \ + \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + ; \ +do + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest* +fi # $ac_x_libraries = NO + +if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$ac_t""$have_x" 1>&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 +fi + +if test "$x_libraries" = "/usr/lib"; then + echo "Ignoring X library directory \"$x_libraries\" requested by configure." + x_libraries="NONE" +fi +if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then + LDFLAGS="$LDFLAGS -L$x_libraries" + if test "$uname" = "SunOS"; then + LDFLAGS="$LDFLAGS -R$x_libraries" + fi +fi +if test "$x_includes" = "/usr/include"; then + echo "Ignoring X include directory \"$x_includes\" requested by configure." + x_includes="NONE" +fi +if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then + CFLAGS="$CFLAGS -I$x_includes" + CXXFLAGS="$CXXFLAGS -I$x_includes" +fi +echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6 +echo "configure:1332: checking for socket in -lsocket" >&5 +ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsocket $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1340 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char socket(); + +int main() { +socket() +; return 0; } +EOF +if { (eval echo configure:1351: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + if test "$uname" != "IRIX"; then + LIBS="-lsocket $LIBS" +else + echo "Not using -lsocket since you are running IRIX." +fi +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for gethostbyaddr in -lnsl""... $ac_c" 1>&6 +echo "configure:1376: checking for gethostbyaddr in -lnsl" >&5 +ac_lib_var=`echo nsl'_'gethostbyaddr | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lnsl $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1384 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyaddr(); + +int main() { +gethostbyaddr() +; return 0; } +EOF +if { (eval echo configure:1395: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + if test "$uname" != "IRIX"; then + LIBS="-lnsl $LIBS" +else + echo "Not using -lnsl since you are running IRIX." +fi +else + echo "$ac_t""no" 1>&6 +fi + + +echo $ac_n "checking for httpConnect in -lcups""... $ac_c" 1>&6 +echo "configure:1421: checking for httpConnect in -lcups" >&5 +ac_lib_var=`echo cups'_'httpConnect | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lcups $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1429 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char httpConnect(); + +int main() { +httpConnect() +; return 0; } +EOF +if { (eval echo configure:1440: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo cups | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-lcups $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for pow in -lm""... $ac_c" 1>&6 +echo "configure:1468: checking for pow in -lm" >&5 +ac_lib_var=`echo m'_'pow | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lm $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1476 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pow(); + +int main() { +pow() +; return 0; } +EOF +if { (eval echo configure:1487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-lm $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for glEnable in -lGL""... $ac_c" 1>&6 +echo "configure:1515: checking for glEnable in -lGL" >&5 +ac_lib_var=`echo GL'_'glEnable | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lGL $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1523 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char glEnable(); + +int main() { +glEnable() +; return 0; } +EOF +if { (eval echo configure:1534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo GL | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-lGL $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for numericsort in -lfltk""... $ac_c" 1>&6 +echo "configure:1562: checking for numericsort in -lfltk" >&5 +ac_lib_var=`echo fltk'_'numericsort | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lfltk $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1570 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char numericsort(); + +int main() { +numericsort() +; return 0; } +EOF +if { (eval echo configure:1581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo fltk | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-lfltk $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CC@%$CC%g +s%@CXX@%$CXX%g +s%@RANLIB@%$RANLIB%g +s%@AR@%$AR%g +s%@RM@%$RM%g +s%@CPP@%$CPP%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"Makefile"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <<EOF + +EOF +cat >> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + + diff --git a/SrcUnix/espws-2.0/configure.in b/SrcUnix/espws-2.0/configure.in new file mode 100644 index 0000000..caaf578 --- /dev/null +++ b/SrcUnix/espws-2.0/configure.in @@ -0,0 +1,69 @@ +dnl +dnl Autoconf configuration script for FLTK widget. +dnl +dnl Copyright 1999 by Michael Sweet. +dnl +dnl Permission is granted to use, copy, modify, and redistribute this file as +dnl needed. +dnl + +dnl Make sure we have the template for the makefile... +AC_INIT(Makefile.in) + +dnl What OS? +uname=`uname` +if test "$uname" = "IRIX64"; then + uname="IRIX" +fi + +dnl Checks for programs... +AC_PROG_CC +AC_PROG_CXX +AC_PROG_RANLIB +AC_PATH_PROG(AR,ar) +AC_PATH_PROG(RM,rm) + +dnl Check for libraries... +AC_PATH_X +if test "$x_libraries" = "/usr/lib"; then + echo "Ignoring X library directory \"$x_libraries\" requested by configure." + x_libraries="NONE" +fi +if test ! "$x_libraries" = "NONE" -a ! "$x_libraries" = ""; then + LDFLAGS="$LDFLAGS -L$x_libraries" + if test "$uname" = "SunOS"; then + LDFLAGS="$LDFLAGS -R$x_libraries" + fi +fi +if test "$x_includes" = "/usr/include"; then + echo "Ignoring X include directory \"$x_includes\" requested by configure." + x_includes="NONE" +fi +if test ! "$x_includes" = "NONE" -a ! "$x_includes" = ""; then + CFLAGS="$CFLAGS -I$x_includes" + CXXFLAGS="$CXXFLAGS -I$x_includes" +fi +AC_CHECK_LIB(socket,socket, +if test "$uname" != "IRIX"; then + LIBS="-lsocket $LIBS" +else + echo "Not using -lsocket since you are running IRIX." +fi) +AC_CHECK_LIB(nsl,gethostbyaddr, +if test "$uname" != "IRIX"; then + LIBS="-lnsl $LIBS" +else + echo "Not using -lnsl since you are running IRIX." +fi) + +AC_CHECK_LIB(cups,httpConnect) +AC_CHECK_LIB(m,pow) +AC_CHECK_LIB(GL,glEnable) +AC_CHECK_LIB(fltk,numericsort) + +dnl Output the makefile... +AC_OUTPUT(Makefile) + +dnl +dnl End of configure script. +dnl diff --git a/SrcUnix/espws-2.0/documentation.html b/SrcUnix/espws-2.0/documentation.html new file mode 100644 index 0000000..403478b --- /dev/null +++ b/SrcUnix/espws-2.0/documentation.html @@ -0,0 +1,73 @@ +<HTML> +<HEAD> + <TITLE>Documentation - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORDS="14,8,51,21" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORDS="82,8,128,21" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORDS="150,8,269,21" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORDS="291,8,369,21" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORDS="391,8,434,21" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<P ALIGN="CENTER"> +<IMG SRC="navbar.gif" WIDTH="449" HEIGHT="30" BORDER="0" ISMAP USEMAP="#navbar"> +<BR> +<A HREF="http://www.easysw.com">ESP</A> | +<A HREF="index.html">Home</A> | +<A HREF="documentation.html">Documentation</A> | +<A HREF="download.html">Download</A> | +<A HREF="http://www.fltk.org">FLTK</A> +</P> + +<H1 ALIGN="CENTER">Documentation</H1> + +<P><A HREF="espws.pdf">PDF Version (???k)</A> + +<OL> + + <LI><A HREF="intro.html">Introduction</A> + + <LI><A HREF="file.html">The File Chooser</A> + + <LI><A HREF="help.html">The Help Dialog</A> + + <LI><A HREF="flsurf.html">The Help Application (flsurf)</A> + + <LI><A HREF="widgets.html">Widget Reference</A> + + <UL> + + <LI><A HREF="CheckButton.html">CheckButton</A> + + <LI><A HREF="FileBrowser.html">FileBrowser</A> + + <LI><A HREF="FileChooser.html">FileChooser</A> + + <LI><A HREF="FileInput.html">FileInput</A> + + <LI><A HREF="Fl_Wizard.html">Fl_Wizard</A> + + <LI><A HREF="HelpApp.html">HelpApp</A> + + <LI><A HREF="HelpDialog.html">HelpDialog</A> + + <LI><A HREF="HelpView.html">HelpView</A> + + </UL> + + <LI><A HREF="relnotes.html">Release Notes</A> + +</OL> + +<HR> + +<P>Copyright 1997-2000 by Easy Software Products. This software is provided +under the terms of the <A HREF="http://www.fsf.org/copyleft/gpl.html"> +GNU General Public License</A>. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/download.html b/SrcUnix/espws-2.0/download.html new file mode 100644 index 0000000..064b089 --- /dev/null +++ b/SrcUnix/espws-2.0/download.html @@ -0,0 +1,54 @@ +<HTML> +<HEAD> + <TITLE>Download - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORDS="14,8,51,21" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORDS="82,8,128,21" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORDS="150,8,269,21" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORDS="291,8,369,21" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORDS="391,8,434,21" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<P ALIGN="CENTER"> +<IMG SRC="navbar.gif" WIDTH="449" HEIGHT="30" BORDER="0" ISMAP USEMAP="#navbar"> +<BR> +<A HREF="http://www.easysw.com">ESP</A> | +<A HREF="index.html">Home</A> | +<A HREF="documentation.html">Documentation</A> | +<A HREF="download.html">Download</A> | +<A HREF="http://www.fltk.org">FLTK</A> +</P> + +<H1 ALIGN="CENTER">Download</H1> + +<P>The ESP Widget Set for FLTK is available for download in three +flavors for your convenience: + +<UL> + + <LI><A HREF="ftp://ftp.easysw.com/pub/fltk/contrib/espws20.tar.gz"> + 2.0 Source in .tar.gz format (165k)</A> + + <LI><A HREF="ftp://ftp.easysw.com/pub/fltk/contrib/espws20.tar.bz2"> + 2.0 Source in .tar.bz2 format (150k)</A> + + <LI><A HREF="ftp://ftp.easysw.com/pub/fltk/contrib/espws20.zip"> + 2.0 Source in .zip format (181k)</A> + +</UL> + +<P>Please read the <A HREF="documentation.html">documentation</A> if you need +assistance. + +<HR> + +<P>Copyright 1997-2000 by Easy Software Products. This software is provided +under the terms of the <A HREF="http://www.fsf.org/copyleft/gpl.html"> +GNU General Public License</A>. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/espws.book b/SrcUnix/espws-2.0/espws.book new file mode 100644 index 0000000..c010298 --- /dev/null +++ b/SrcUnix/espws-2.0/espws.book @@ -0,0 +1,18 @@ +#HTMLDOC 1.8.6 +15 +intro.html +file.html +help.html +flsurf.html +widgets.html +CheckButton.html +FileBrowser.html +FileChooser.html +FileIcon.html +FileInput.html +Fl_Wizard.html +HelpApp.html +HelpDialog.html +HelpView.html +relnotes.html +-t pdf12 -f espws.pdf --book --toclevels 2 --toctitle "Table of Contents" --title --linkstyle underline --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --compression=9 --jpeg=90 --fontsize 11.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 11.0 --headfootfont Helvetica --charset 8859-1 --pagemode outlines --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --browserwidth 680 diff --git a/SrcUnix/espws-2.0/espws.pdf b/SrcUnix/espws-2.0/espws.pdf new file mode 100644 index 0000000..c2e7517 --- /dev/null +++ b/SrcUnix/espws-2.0/espws.pdf @@ -0,0 +1,1378 @@ +%PDF-1.2 +%âãÏÓ +1 0 obj<</Producer(htmldoc 1.8.6 Copyright 1997-2000 Easy Software Products, All Rights Reserved.)/CreationDate(D:20000320020228Z)/Title(ESP Widget Set for FLTK)/Author(Easy Software Products)>>endobj +2 0 obj<</Type/Encoding/Differences[ 32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/minus/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 160/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]>>endobj +3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj +4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier-Bold/Encoding 2 0 R>>endobj +5 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier-BoldOblique/Encoding 2 0 R>>endobj +6 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj +7 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Bold/Encoding 2 0 R>>endobj +8 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding 2 0 R>>endobj +9 0 obj<</Type/Font/Subtype/Type1/BaseFont/Helvetica-Bold/Encoding 2 0 R>>endobj +10 0 obj<</Type/Font/Subtype/Type1/BaseFont/Symbol>>endobj +11 0 obj<</S/URI/URI(http://www.fsf.org/copyleft/gpl.html)>>endobj +12 0 obj<</Subtype/Link/Rect[328.3 669.6 457.5 682.6]/Border[0 0 0]/A 11 0 R>>endobj +13 0 obj[12 0 R +]endobj +14 0 obj<</S/URI/URI(http://www.cups.org)>>endobj +15 0 obj<</Subtype/Link/Rect[243.7 565.6 271.2 578.6]/Border[0 0 0]/A 14 0 R>>endobj +16 0 obj[15 0 R +]endobj +17 0 obj<</Subtype/Link/Rect[108.0 656.4 180.6 669.4]/Border[0 0 0]/Dest[321 0 R/XYZ null 384 0]>>endobj +18 0 obj<</Subtype/Link/Rect[108.0 643.2 180.6 656.2]/Border[0 0 0]/Dest[324 0 R/XYZ null 281 0]>>endobj +19 0 obj<</Subtype/Link/Rect[108.0 630.0 160.8 643.0]/Border[0 0 0]/Dest[336 0 R/XYZ null 49 0]>>endobj +20 0 obj<</Subtype/Link/Rect[108.0 616.8 167.4 629.8]/Border[0 0 0]/Dest[348 0 R/XYZ null 268 0]>>endobj +21 0 obj<</Subtype/Link/Rect[108.0 603.6 160.8 616.6]/Border[0 0 0]/Dest[369 0 R/XYZ null 275 0]>>endobj +22 0 obj<</Subtype/Link/Rect[108.0 511.2 180.6 524.2]/Border[0 0 0]/Dest[327 0 R/XYZ null 57 0]>>endobj +23 0 obj<</Subtype/Link/Rect[108.0 484.8 174.0 497.8]/Border[0 0 0]/Dest[363 0 R/XYZ null 499 0]>>endobj +24 0 obj<</Subtype/Link/Rect[108.0 471.6 154.2 484.6]/Border[0 0 0]/Dest[354 0 R/XYZ null 645 0]>>endobj +25 0 obj<</Subtype/Link/Rect[433.2 432.0 457.0 445.0]/Border[0 0 0]/Dest[309 0 R/XYZ null 308 0]>>endobj +26 0 obj[17 0 R +18 0 R +19 0 R +20 0 R +21 0 R +22 0 R +23 0 R +24 0 R +25 0 R +]endobj +27 0 obj<</Subtype/Link/Rect[72.0 434.7 130.1 447.7]/Border[0 0 0]/Dest[324 0 R/XYZ null 440 0]>>endobj +28 0 obj<</Subtype/Link/Rect[72.0 421.5 136.0 434.5]/Border[0 0 0]/Dest[324 0 R/XYZ null 387 0]>>endobj +29 0 obj[27 0 R +28 0 R +]endobj +30 0 obj<</Subtype/Link/Rect[108.0 447.9 162.4 460.9]/Border[0 0 0]/Dest[327 0 R/XYZ null 413 0]>>endobj +31 0 obj<</Subtype/Link/Rect[108.0 434.7 168.3 447.7]/Border[0 0 0]/Dest[327 0 R/XYZ null 361 0]>>endobj +32 0 obj<</Subtype/Link/Rect[108.0 421.5 144.0 434.5]/Border[0 0 0]/Dest[327 0 R/XYZ null 308 0]>>endobj +33 0 obj<</Subtype/Link/Rect[108.0 408.3 129.4 421.3]/Border[0 0 0]/Dest[327 0 R/XYZ null 242 0]>>endobj +34 0 obj<</Subtype/Link/Rect[108.0 395.1 126.9 408.1]/Border[0 0 0]/Dest[327 0 R/XYZ null 176 0]>>endobj +35 0 obj[30 0 R +31 0 R +32 0 R +33 0 R +34 0 R +]endobj +36 0 obj<</Subtype/Link/Rect[72.0 190.9 125.8 203.9]/Border[0 0 0]/Dest[333 0 R/XYZ null 671 0]>>endobj +37 0 obj<</Subtype/Link/Rect[72.0 177.7 131.7 190.7]/Border[0 0 0]/Dest[333 0 R/XYZ null 447 0]>>endobj +38 0 obj<</Subtype/Link/Rect[72.0 164.5 94.6 177.5]/Border[0 0 0]/Dest[333 0 R/XYZ null 394 0]>>endobj +39 0 obj<</Subtype/Link/Rect[72.0 151.3 96.4 164.3]/Border[0 0 0]/Dest[333 0 R/XYZ null 328 0]>>endobj +40 0 obj<</Subtype/Link/Rect[72.0 138.1 111.7 151.1]/Border[0 0 0]/Dest[333 0 R/XYZ null 275 0]>>endobj +41 0 obj<</Subtype/Link/Rect[72.0 124.9 93.4 137.9]/Border[0 0 0]/Dest[333 0 R/XYZ null 209 0]>>endobj +42 0 obj<</Subtype/Link/Rect[72.0 111.7 90.9 124.7]/Border[0 0 0]/Dest[333 0 R/XYZ null 143 0]>>endobj +43 0 obj<</Subtype/Link/Rect[72.0 98.5 108.0 111.5]/Border[0 0 0]/Dest[336 0 R/XYZ null 763 0]>>endobj +44 0 obj<</Subtype/Link/Rect[72.0 85.3 93.4 98.3]/Border[0 0 0]/Dest[336 0 R/XYZ null 684 0]>>endobj +45 0 obj<</Subtype/Link/Rect[72.0 72.1 100.1 85.1]/Border[0 0 0]/Dest[336 0 R/XYZ null 618 0]>>endobj +46 0 obj<</Subtype/Link/Rect[72.0 58.9 95.2 71.9]/Border[0 0 0]/Dest[336 0 R/XYZ null 565 0]>>endobj +47 0 obj[36 0 R +37 0 R +38 0 R +39 0 R +40 0 R +41 0 R +42 0 R +43 0 R +44 0 R +45 0 R +46 0 R +]endobj +48 0 obj<</Subtype/Link/Rect[108.0 718.8 147.1 731.8]/Border[0 0 0]/Dest[336 0 R/XYZ null 513 0]>>endobj +49 0 obj<</Subtype/Link/Rect[108.0 705.6 142.2 718.6]/Border[0 0 0]/Dest[336 0 R/XYZ null 447 0]>>endobj +50 0 obj<</Subtype/Link/Rect[108.0 692.4 141.6 705.4]/Border[0 0 0]/Dest[336 0 R/XYZ null 381 0]>>endobj +51 0 obj<</Subtype/Link/Rect[108.0 679.2 126.9 692.2]/Border[0 0 0]/Dest[336 0 R/XYZ null 315 0]>>endobj +52 0 obj<</Subtype/Link/Rect[108.0 666.0 131.8 679.0]/Border[0 0 0]/Dest[336 0 R/XYZ null 249 0]>>endobj +53 0 obj<</Subtype/Link/Rect[108.0 652.8 137.3 665.8]/Border[0 0 0]/Dest[336 0 R/XYZ null 169 0]>>endobj +54 0 obj[48 0 R +49 0 R +50 0 R +51 0 R +52 0 R +53 0 R +]endobj +55 0 obj<</Subtype/Link/Rect[108.0 456.7 144.7 469.7]/Border[0 0 0]/Dest[339 0 R/XYZ null 237 0]>>endobj +56 0 obj<</Subtype/Link/Rect[108.0 443.5 150.6 456.5]/Border[0 0 0]/Dest[339 0 R/XYZ null 185 0]>>endobj +57 0 obj<</Subtype/Link/Rect[108.0 430.3 123.9 443.3]/Border[0 0 0]/Dest[342 0 R/XYZ null 763 0]>>endobj +58 0 obj<</Subtype/Link/Rect[108.0 417.1 152.0 430.1]/Border[0 0 0]/Dest[342 0 R/XYZ null 711 0]>>endobj +59 0 obj<</Subtype/Link/Rect[108.0 403.9 156.9 416.9]/Border[0 0 0]/Dest[342 0 R/XYZ null 658 0]>>endobj +60 0 obj<</Subtype/Link/Rect[108.0 390.7 129.4 403.7]/Border[0 0 0]/Dest[342 0 R/XYZ null 565 0]>>endobj +61 0 obj<</Subtype/Link/Rect[108.0 377.5 130.0 390.5]/Border[0 0 0]/Dest[342 0 R/XYZ null 513 0]>>endobj +62 0 obj<</Subtype/Link/Rect[108.0 364.3 125.7 377.3]/Border[0 0 0]/Dest[342 0 R/XYZ null 460 0]>>endobj +63 0 obj<</Subtype/Link/Rect[108.0 351.1 125.7 364.1]/Border[0 0 0]/Dest[342 0 R/XYZ null 407 0]>>endobj +64 0 obj<</Subtype/Link/Rect[108.0 337.9 129.4 350.9]/Border[0 0 0]/Dest[342 0 R/XYZ null 354 0]>>endobj +65 0 obj<</Subtype/Link/Rect[108.0 324.7 148.3 337.7]/Border[0 0 0]/Dest[342 0 R/XYZ null 301 0]>>endobj +66 0 obj<</Subtype/Link/Rect[108.0 311.5 142.2 324.5]/Border[0 0 0]/Dest[342 0 R/XYZ null 196 0]>>endobj +67 0 obj<</Subtype/Link/Rect[108.0 298.3 126.9 311.3]/Border[0 0 0]/Dest[342 0 R/XYZ null 249 0]>>endobj +68 0 obj<</Subtype/Link/Rect[108.0 285.1 191.7 298.1]/Border[0 0 0]/Dest[342 0 R/XYZ null 143 0]>>endobj +69 0 obj<</Subtype/Link/Rect[108.0 271.9 152.0 284.9]/Border[0 0 0]/Dest[345 0 R/XYZ null 739 0]>>endobj +70 0 obj<</Subtype/Link/Rect[108.0 258.7 138.5 271.7]/Border[0 0 0]/Dest[345 0 R/XYZ null 686 0]>>endobj +71 0 obj<</Subtype/Link/Rect[108.0 245.5 125.1 258.5]/Border[0 0 0]/Dest[345 0 R/XYZ null 634 0]>>endobj +72 0 obj<</Subtype/Link/Rect[108.0 232.3 126.9 245.3]/Border[0 0 0]/Dest[345 0 R/XYZ null 581 0]>>endobj +73 0 obj<</Subtype/Link/Rect[108.0 219.1 131.8 232.1]/Border[0 0 0]/Dest[345 0 R/XYZ null 436 0]>>endobj +74 0 obj[55 0 R +56 0 R +57 0 R +58 0 R +59 0 R +60 0 R +61 0 R +62 0 R +63 0 R +64 0 R +65 0 R +66 0 R +67 0 R +68 0 R +69 0 R +70 0 R +71 0 R +72 0 R +73 0 R +]endobj +75 0 obj<</Subtype/Link/Rect[72.0 421.5 112.3 434.5]/Border[0 0 0]/Dest[348 0 R/XYZ null 427 0]>>endobj +76 0 obj<</Subtype/Link/Rect[72.0 408.3 118.3 421.3]/Border[0 0 0]/Dest[348 0 R/XYZ null 374 0]>>endobj +77 0 obj[75 0 R +76 0 R +]endobj +78 0 obj<</Subtype/Link/Rect[108.0 381.9 155.0 394.9]/Border[0 0 0]/Dest[351 0 R/XYZ null 347 0]>>endobj +79 0 obj<</Subtype/Link/Rect[108.0 368.7 161.0 381.7]/Border[0 0 0]/Dest[351 0 R/XYZ null 295 0]>>endobj +80 0 obj<</Subtype/Link/Rect[108.0 355.5 126.9 368.5]/Border[0 0 0]/Dest[351 0 R/XYZ null 242 0]>>endobj +81 0 obj<</Subtype/Link/Rect[108.0 342.3 127.5 355.3]/Border[0 0 0]/Dest[351 0 R/XYZ null 189 0]>>endobj +82 0 obj<</Subtype/Link/Rect[108.0 329.1 131.8 342.1]/Border[0 0 0]/Dest[354 0 R/XYZ null 763 0]>>endobj +83 0 obj[78 0 R +79 0 R +80 0 R +81 0 R +82 0 R +]endobj +84 0 obj<</Subtype/Link/Rect[108.0 140.7 148.3 153.7]/Border[0 0 0]/Dest[360 0 R/XYZ null 658 0]>>endobj +85 0 obj<</S/URI/URI(#HelpApp.~HelpApp)>>endobj +86 0 obj<</Subtype/Link/Rect[108.0 127.5 154.3 140.5]/Border[0 0 0]/A 85 0 R>>endobj +87 0 obj<</Subtype/Link/Rect[108.0 114.3 113.5 127.3]/Border[0 0 0]/Dest[360 0 R/XYZ null 552 0]>>endobj +88 0 obj<</Subtype/Link/Rect[108.0 101.1 126.9 114.1]/Border[0 0 0]/Dest[360 0 R/XYZ null 499 0]>>endobj +89 0 obj<</Subtype/Link/Rect[108.0 87.9 126.9 100.9]/Border[0 0 0]/Dest[360 0 R/XYZ null 447 0]>>endobj +90 0 obj<</Subtype/Link/Rect[108.0 74.7 143.5 87.7]/Border[0 0 0]/Dest[360 0 R/XYZ null 381 0]>>endobj +91 0 obj<</Subtype/Link/Rect[108.0 61.5 133.7 74.5]/Border[0 0 0]/Dest[360 0 R/XYZ null 328 0]>>endobj +92 0 obj[84 0 R +86 0 R +87 0 R +88 0 R +89 0 R +90 0 R +91 0 R +]endobj +93 0 obj<</Subtype/Link/Rect[72.0 718.8 95.2 731.8]/Border[0 0 0]/Dest[360 0 R/XYZ null 275 0]>>endobj +94 0 obj<</Subtype/Link/Rect[72.0 705.6 105.6 718.6]/Border[0 0 0]/Dest[360 0 R/XYZ null 222 0]>>endobj +95 0 obj<</Subtype/Link/Rect[72.0 692.4 102.6 705.4]/Border[0 0 0]/Dest[360 0 R/XYZ null 156 0]>>endobj +96 0 obj<</Subtype/Link/Rect[72.0 679.2 101.3 692.2]/Border[0 0 0]/Dest[363 0 R/XYZ null 763 0]>>endobj +97 0 obj<</Subtype/Link/Rect[72.0 666.0 79.9 679.0]/Border[0 0 0]/Dest[363 0 R/XYZ null 711 0]>>endobj +98 0 obj<</Subtype/Link/Rect[72.0 652.8 77.5 665.8]/Border[0 0 0]/Dest[363 0 R/XYZ null 658 0]>>endobj +99 0 obj<</Subtype/Link/Rect[72.0 639.6 77.5 652.6]/Border[0 0 0]/Dest[363 0 R/XYZ null 605 0]>>endobj +100 0 obj[93 0 R +94 0 R +95 0 R +96 0 R +97 0 R +98 0 R +99 0 R +]endobj +101 0 obj<</Subtype/Link/Rect[72.0 115.7 123.3 128.7]/Border[0 0 0]/Dest[369 0 R/XYZ null 724 0]>>endobj +102 0 obj<</S/URI/URI(#HelpDialog.~HelpDialog)>>endobj +103 0 obj<</Subtype/Link/Rect[72.0 104.5 129.3 115.5]/Border[0 0 0]/A 102 0 R>>endobj +104 0 obj<</Subtype/Link/Rect[72.0 89.3 90.9 102.3]/Border[0 0 0]/Dest[369 0 R/XYZ null 618 0]>>endobj +105 0 obj<</Subtype/Link/Rect[72.0 76.1 90.9 89.1]/Border[0 0 0]/Dest[369 0 R/XYZ null 565 0]>>endobj +106 0 obj<</Subtype/Link/Rect[72.0 62.9 95.2 75.9]/Border[0 0 0]/Dest[369 0 R/XYZ null 499 0]>>endobj +107 0 obj[101 0 R +103 0 R +104 0 R +105 0 R +106 0 R +]endobj +108 0 obj<</Subtype/Link/Rect[108.0 718.8 138.6 731.8]/Border[0 0 0]/Dest[369 0 R/XYZ null 447 0]>>endobj +109 0 obj<</Subtype/Link/Rect[108.0 705.6 137.3 718.6]/Border[0 0 0]/Dest[369 0 R/XYZ null 381 0]>>endobj +110 0 obj[108 0 R +109 0 R +]endobj +111 0 obj<</Subtype/Link/Rect[72.0 434.7 117.2 447.7]/Border[0 0 0]/Dest[372 0 R/XYZ null 295 0]>>endobj +112 0 obj<</Subtype/Link/Rect[72.0 421.5 123.2 434.5]/Border[0 0 0]/Dest[372 0 R/XYZ null 242 0]>>endobj +113 0 obj<</Subtype/Link/Rect[72.0 408.3 111.7 421.3]/Border[0 0 0]/Dest[372 0 R/XYZ null 189 0]>>endobj +114 0 obj<</Subtype/Link/Rect[72.0 395.1 110.5 408.1]/Border[0 0 0]/Dest[375 0 R/XYZ null 763 0]>>endobj +115 0 obj<</Subtype/Link/Rect[72.0 381.9 89.1 394.9]/Border[0 0 0]/Dest[375 0 R/XYZ null 711 0]>>endobj +116 0 obj<</Subtype/Link/Rect[72.0 368.7 90.9 381.7]/Border[0 0 0]/Dest[375 0 R/XYZ null 618 0]>>endobj +117 0 obj<</Subtype/Link/Rect[72.0 355.5 89.1 368.5]/Border[0 0 0]/Dest[375 0 R/XYZ null 565 0]>>endobj +118 0 obj<</Subtype/Link/Rect[72.0 342.3 111.1 355.3]/Border[0 0 0]/Dest[375 0 R/XYZ null 513 0]>>endobj +119 0 obj<</Subtype/Link/Rect[72.0 329.1 106.2 342.1]/Border[0 0 0]/Dest[375 0 R/XYZ null 447 0]>>endobj +120 0 obj<</Subtype/Link/Rect[72.0 315.9 105.6 328.9]/Border[0 0 0]/Dest[375 0 R/XYZ null 381 0]>>endobj +121 0 obj<</Subtype/Link/Rect[72.0 302.7 89.1 315.7]/Border[0 0 0]/Dest[375 0 R/XYZ null 315 0]>>endobj +122 0 obj<</Subtype/Link/Rect[72.0 289.5 102.6 302.5]/Border[0 0 0]/Dest[375 0 R/XYZ null 262 0]>>endobj +123 0 obj<</Subtype/Link/Rect[72.0 276.3 95.8 289.3]/Border[0 0 0]/Dest[375 0 R/XYZ null 156 0]>>endobj +124 0 obj[111 0 R +112 0 R +113 0 R +114 0 R +115 0 R +116 0 R +117 0 R +118 0 R +119 0 R +120 0 R +121 0 R +122 0 R +123 0 R +]endobj +125 0 obj<</Subtype/Link/Rect[101.9 600.0 148.1 613.0]/Border[0 0 0]/Dest[354 0 R/XYZ null 645 0]>>endobj +126 0 obj[125 0 R +]endobj +127 0 obj<</Subtype/Link/Rect[72.0 673.2 131.9 686.2]/Border[0 0 0]/Dest[297 0 R/XYZ null 812 0]>>endobj +128 0 obj<</Subtype/Link/Rect[108.0 660.0 281.2 673.0]/Border[0 0 0]/Dest[297 0 R/XYZ null 672 0]>>endobj +129 0 obj<</Subtype/Link/Rect[108.0 646.8 295.9 659.8]/Border[0 0 0]/Dest[297 0 R/XYZ null 427 0]>>endobj +130 0 obj<</Subtype/Link/Rect[72.0 620.4 152.7 633.4]/Border[0 0 0]/Dest[303 0 R/XYZ null 812 0]>>endobj +131 0 obj<</Subtype/Link/Rect[108.0 607.2 177.7 620.2]/Border[0 0 0]/Dest[303 0 R/XYZ null 698 0]>>endobj +132 0 obj<</Subtype/Link/Rect[108.0 594.0 242.1 607.0]/Border[0 0 0]/Dest[303 0 R/XYZ null 436 0]>>endobj +133 0 obj<</Subtype/Link/Rect[72.0 567.6 149.0 580.6]/Border[0 0 0]/Dest[309 0 R/XYZ null 812 0]>>endobj +134 0 obj<</Subtype/Link/Rect[108.0 554.4 177.7 567.4]/Border[0 0 0]/Dest[309 0 R/XYZ null 685 0]>>endobj +135 0 obj<</Subtype/Link/Rect[108.0 541.2 239.7 554.2]/Border[0 0 0]/Dest[309 0 R/XYZ null 607 0]>>endobj +136 0 obj<</Subtype/Link/Rect[72.0 514.8 209.2 527.8]/Border[0 0 0]/Dest[315 0 R/XYZ null 812 0]>>endobj +137 0 obj<</Subtype/Link/Rect[108.0 501.6 177.7 514.6]/Border[0 0 0]/Dest[315 0 R/XYZ null 711 0]>>endobj +138 0 obj<</Subtype/Link/Rect[108.0 488.4 228.7 501.4]/Border[0 0 0]/Dest[315 0 R/XYZ null 594 0]>>endobj +139 0 obj<</Subtype/Link/Rect[72.0 462.0 110.5 475.0]/Border[0 0 0]/Dest[321 0 R/XYZ null 812 0]>>endobj +140 0 obj<</Subtype/Link/Rect[108.0 448.8 190.2 461.8]/Border[0 0 0]/Dest[324 0 R/XYZ null 793 0]>>endobj +141 0 obj<</Subtype/Link/Rect[108.0 435.6 186.5 448.6]/Border[0 0 0]/Dest[327 0 R/XYZ null 793 0]>>endobj +142 0 obj<</Subtype/Link/Rect[108.0 422.4 185.9 435.4]/Border[0 0 0]/Dest[330 0 R/XYZ null 793 0]>>endobj +143 0 obj<</Subtype/Link/Rect[108.0 409.2 168.8 422.2]/Border[0 0 0]/Dest[339 0 R/XYZ null 793 0]>>endobj +144 0 obj<</Subtype/Link/Rect[108.0 396.0 172.5 409.0]/Border[0 0 0]/Dest[348 0 R/XYZ null 793 0]>>endobj +145 0 obj<</Subtype/Link/Rect[108.0 382.8 179.2 395.8]/Border[0 0 0]/Dest[351 0 R/XYZ null 793 0]>>endobj +146 0 obj<</Subtype/Link/Rect[108.0 369.6 172.5 382.6]/Border[0 0 0]/Dest[357 0 R/XYZ null 793 0]>>endobj +147 0 obj<</Subtype/Link/Rect[108.0 356.4 183.5 369.4]/Border[0 0 0]/Dest[366 0 R/XYZ null 793 0]>>endobj +148 0 obj<</Subtype/Link/Rect[108.0 343.2 177.3 356.2]/Border[0 0 0]/Dest[372 0 R/XYZ null 793 0]>>endobj +149 0 obj<</Subtype/Link/Rect[72.0 316.8 136.4 329.8]/Border[0 0 0]/Dest[381 0 R/XYZ null 812 0]>>endobj +150 0 obj<</Subtype/Link/Rect[108.0 303.6 179.2 316.6]/Border[0 0 0]/Dest[381 0 R/XYZ null 732 0]>>endobj +151 0 obj<</Subtype/Link/Rect[108.0 290.4 235.4 303.4]/Border[0 0 0]/Dest[381 0 R/XYZ null 403 0]>>endobj +152 0 obj<</Subtype/Link/Rect[108.0 277.2 244.0 290.2]/Border[0 0 0]/Dest[381 0 R/XYZ null 339 0]>>endobj +153 0 obj<</Subtype/Link/Rect[108.0 264.0 244.0 277.0]/Border[0 0 0]/Dest[381 0 R/XYZ null 222 0]>>endobj +154 0 obj<</Subtype/Link/Rect[108.0 250.8 235.7 263.8]/Border[0 0 0]/Dest[384 0 R/XYZ null 793 0]>>endobj +155 0 obj<</Subtype/Link/Rect[108.0 237.6 235.7 250.6]/Border[0 0 0]/Dest[384 0 R/XYZ null 675 0]>>endobj +156 0 obj<</Subtype/Link/Rect[108.0 224.4 235.7 237.4]/Border[0 0 0]/Dest[384 0 R/XYZ null 558 0]>>endobj +157 0 obj<</Subtype/Link/Rect[108.0 211.2 235.7 224.2]/Border[0 0 0]/Dest[384 0 R/XYZ null 216 0]>>endobj +158 0 obj[127 0 R +128 0 R +129 0 R +130 0 R +131 0 R +132 0 R +133 0 R +134 0 R +135 0 R +136 0 R +137 0 R +138 0 R +139 0 R +140 0 R +141 0 R +142 0 R +143 0 R +144 0 R +145 0 R +146 0 R +147 0 R +148 0 R +149 0 R +150 0 R +151 0 R +152 0 R +153 0 R +154 0 R +155 0 R +156 0 R +157 0 R +]endobj +159 0 obj<</Dests 160 0 R>>endobj +160 0 obj<</Kids[161 0 R]>>endobj +161 0 obj<</Limits[(1)(widgets.html)]/Names[(1)162 0 R(1_1)163 0 R(1_2)164 0 R(2)165 0 R(2_1)166 0 R(2_2)167 0 R(3)168 0 R(3_1)169 0 R(3_2)170 0 R(4)171 0 R(4_1)172 0 R(4_2)173 0 R(5)174 0 R(5_1)175 0 R(5_2)176 0 R(5_3)177 0 R(5_4)178 0 R(5_5)179 0 R(5_6)180 0 R(5_7)181 0 R(5_8)182 0 R(5_9)183 0 R(6)184 0 R(6_1)185 0 R(6_2)186 0 R(6_3)187 0 R(6_4)188 0 R(6_5)189 0 R(6_6)190 0 R(6_7)191 0 R(6_8)192 0 R(checkbutton.checkbutton)193 0 R(checkbutton.html)194 0 R(checkbutton.~checkbutton)195 0 R(file.html)196 0 R(filebrowser.filebrowser)197 0 R(filebrowser.filter)198 0 R(filebrowser.html)199 0 R(filebrowser.iconsize)200 0 R(filebrowser.load)201 0 R(filebrowser.~filebrowser)202 0 R(filechooser.color)203 0 R(filechooser.count)204 0 R(filechooser.directory)205 0 R(filechooser.filechooser)206 0 R(filechooser.filter)207 0 R(filechooser.hide)208 0 R(filechooser.html)209 0 R(filechooser.iconsize)210 0 R(filechooser.label)211 0 R(filechooser.rescan)212 0 R(filechooser.show)213 0 R(filechooser.textcolor)214 0 R(filechooser.textfont)215 0 R(filechooser.textsize)216 0 R(filechooser.type)217 0 R(filechooser.value)218 0 R(filechooser.visible)219 0 R(filechooser.~filechooser)220 0 R(fileicon.add)221 0 R(fileicon.add_color)222 0 R(fileicon.add_vertex)223 0 R(fileicon.clear)224 0 R(fileicon.draw)225 0 R(fileicon.fileicon)226 0 R(fileicon.find)227 0 R(fileicon.first)228 0 R(fileicon.html)229 0 R(fileicon.label)230 0 R(fileicon.labeltype)231 0 R(fileicon.load)232 0 R(fileicon.load_fti)233 0 R(fileicon.load_system_icons)234 0 R(fileicon.load_xpm)235 0 R(fileicon.pattern)236 0 R(fileicon.size)237 0 R(fileicon.type)238 0 R(fileicon.value)239 0 R(fileicon.~fileicon)240 0 R(fileinput.fileinput)241 0 R(fileinput.html)242 0 R(fileinput.~fileinput)243 0 R(fl_wizard.fl_wizard)244 0 R(fl_wizard.html)245 0 R(fl_wizard.next)246 0 R(fl_wizard.prev)247 0 R(fl_wizard.value)248 0 R(fl_wizard.~fl_wizard)249 0 R(flsurf.html)250 0 R(help.html)251 0 R(helpapp.h)252 0 R(helpapp.helpapp)253 0 R(helpapp.hide)254 0 R(helpapp.html)255 0 R(helpapp.load)256 0 R(helpapp.position)257 0 R(helpapp.resize)258 0 R(helpapp.show)259 0 R(helpapp.textsize)260 0 R(helpapp.topline)261 0 R(helpapp.visible)262 0 R(helpapp.w)263 0 R(helpapp.x)264 0 R(helpapp.y)265 0 R(helpdialog.helpdialog)266 0 R(helpdialog.hide)267 0 R(helpdialog.html)268 0 R(helpdialog.load)269 0 R(helpdialog.show)270 0 R(helpdialog.topline)271 0 R(helpdialog.visible)272 0 R(helpview.directory)273 0 R(helpview.filename)274 0 R(helpview.helpview)275 0 R(helpview.html)276 0 R(helpview.link)277 0 R(helpview.load)278 0 R(helpview.size)279 0 R(helpview.textcolor)280 0 R(helpview.textfont)281 0 R(helpview.textsize)282 0 R(helpview.title)283 0 R(helpview.topline)284 0 R(helpview.value)285 0 R(helpview.~helpview)286 0 R(intro.html)287 0 R(relnotes.html)288 0 R(widgets.html)289 0 R]>>endobj +162 0 obj<</D[297 0 R/XYZ null 812 null]>>endobj +163 0 obj<</D[297 0 R/XYZ null 672 null]>>endobj +164 0 obj<</D[297 0 R/XYZ null 427 null]>>endobj +165 0 obj<</D[303 0 R/XYZ null 812 null]>>endobj +166 0 obj<</D[303 0 R/XYZ null 698 null]>>endobj +167 0 obj<</D[303 0 R/XYZ null 436 null]>>endobj +168 0 obj<</D[309 0 R/XYZ null 812 null]>>endobj +169 0 obj<</D[309 0 R/XYZ null 685 null]>>endobj +170 0 obj<</D[309 0 R/XYZ null 607 null]>>endobj +171 0 obj<</D[315 0 R/XYZ null 812 null]>>endobj +172 0 obj<</D[315 0 R/XYZ null 711 null]>>endobj +173 0 obj<</D[315 0 R/XYZ null 594 null]>>endobj +174 0 obj<</D[321 0 R/XYZ null 812 null]>>endobj +175 0 obj<</D[324 0 R/XYZ null 793 null]>>endobj +176 0 obj<</D[327 0 R/XYZ null 793 null]>>endobj +177 0 obj<</D[330 0 R/XYZ null 793 null]>>endobj +178 0 obj<</D[339 0 R/XYZ null 793 null]>>endobj +179 0 obj<</D[348 0 R/XYZ null 793 null]>>endobj +180 0 obj<</D[351 0 R/XYZ null 793 null]>>endobj +181 0 obj<</D[357 0 R/XYZ null 793 null]>>endobj +182 0 obj<</D[366 0 R/XYZ null 793 null]>>endobj +183 0 obj<</D[372 0 R/XYZ null 793 null]>>endobj +184 0 obj<</D[381 0 R/XYZ null 812 null]>>endobj +185 0 obj<</D[381 0 R/XYZ null 732 null]>>endobj +186 0 obj<</D[381 0 R/XYZ null 403 null]>>endobj +187 0 obj<</D[381 0 R/XYZ null 339 null]>>endobj +188 0 obj<</D[381 0 R/XYZ null 222 null]>>endobj +189 0 obj<</D[384 0 R/XYZ null 793 null]>>endobj +190 0 obj<</D[384 0 R/XYZ null 675 null]>>endobj +191 0 obj<</D[384 0 R/XYZ null 558 null]>>endobj +192 0 obj<</D[384 0 R/XYZ null 216 null]>>endobj +193 0 obj<</D[324 0 R/XYZ null 440 null]>>endobj +194 0 obj<</D[321 0 R/XYZ null 384 null]>>endobj +195 0 obj<</D[324 0 R/XYZ null 387 null]>>endobj +196 0 obj<</D[297 0 R/XYZ null 247 null]>>endobj +197 0 obj<</D[327 0 R/XYZ null 413 null]>>endobj +198 0 obj<</D[327 0 R/XYZ null 242 null]>>endobj +199 0 obj<</D[324 0 R/XYZ null 281 null]>>endobj +200 0 obj<</D[327 0 R/XYZ null 308 null]>>endobj +201 0 obj<</D[327 0 R/XYZ null 176 null]>>endobj +202 0 obj<</D[327 0 R/XYZ null 361 null]>>endobj +203 0 obj<</D[333 0 R/XYZ null 394 null]>>endobj +204 0 obj<</D[333 0 R/XYZ null 328 null]>>endobj +205 0 obj<</D[333 0 R/XYZ null 275 null]>>endobj +206 0 obj<</D[333 0 R/XYZ null 671 null]>>endobj +207 0 obj<</D[333 0 R/XYZ null 209 null]>>endobj +208 0 obj<</D[333 0 R/XYZ null 143 null]>>endobj +209 0 obj<</D[327 0 R/XYZ null 57 null]>>endobj +210 0 obj<</D[336 0 R/XYZ null 763 null]>>endobj +211 0 obj<</D[336 0 R/XYZ null 684 null]>>endobj +212 0 obj<</D[336 0 R/XYZ null 618 null]>>endobj +213 0 obj<</D[336 0 R/XYZ null 565 null]>>endobj +214 0 obj<</D[336 0 R/XYZ null 513 null]>>endobj +215 0 obj<</D[336 0 R/XYZ null 447 null]>>endobj +216 0 obj<</D[336 0 R/XYZ null 381 null]>>endobj +217 0 obj<</D[336 0 R/XYZ null 315 null]>>endobj +218 0 obj<</D[336 0 R/XYZ null 249 null]>>endobj +219 0 obj<</D[336 0 R/XYZ null 169 null]>>endobj +220 0 obj<</D[333 0 R/XYZ null 447 null]>>endobj +221 0 obj<</D[342 0 R/XYZ null 763 null]>>endobj +222 0 obj<</D[342 0 R/XYZ null 711 null]>>endobj +223 0 obj<</D[342 0 R/XYZ null 658 null]>>endobj +224 0 obj<</D[342 0 R/XYZ null 565 null]>>endobj +225 0 obj<</D[342 0 R/XYZ null 513 null]>>endobj +226 0 obj<</D[339 0 R/XYZ null 237 null]>>endobj +227 0 obj<</D[342 0 R/XYZ null 460 null]>>endobj +228 0 obj<</D[342 0 R/XYZ null 407 null]>>endobj +229 0 obj<</D[336 0 R/XYZ null 49 null]>>endobj +230 0 obj<</D[342 0 R/XYZ null 354 null]>>endobj +231 0 obj<</D[342 0 R/XYZ null 301 null]>>endobj +232 0 obj<</D[342 0 R/XYZ null 249 null]>>endobj +233 0 obj<</D[342 0 R/XYZ null 196 null]>>endobj +234 0 obj<</D[342 0 R/XYZ null 143 null]>>endobj +235 0 obj<</D[345 0 R/XYZ null 739 null]>>endobj +236 0 obj<</D[345 0 R/XYZ null 686 null]>>endobj +237 0 obj<</D[345 0 R/XYZ null 634 null]>>endobj +238 0 obj<</D[345 0 R/XYZ null 581 null]>>endobj +239 0 obj<</D[345 0 R/XYZ null 436 null]>>endobj +240 0 obj<</D[339 0 R/XYZ null 185 null]>>endobj +241 0 obj<</D[348 0 R/XYZ null 427 null]>>endobj +242 0 obj<</D[345 0 R/XYZ null 330 null]>>endobj +243 0 obj<</D[348 0 R/XYZ null 374 null]>>endobj +244 0 obj<</D[351 0 R/XYZ null 347 null]>>endobj +245 0 obj<</D[348 0 R/XYZ null 268 null]>>endobj +246 0 obj<</D[351 0 R/XYZ null 242 null]>>endobj +247 0 obj<</D[351 0 R/XYZ null 189 null]>>endobj +248 0 obj<</D[354 0 R/XYZ null 763 null]>>endobj +249 0 obj<</D[351 0 R/XYZ null 295 null]>>endobj +250 0 obj<</D[309 0 R/XYZ null 308 null]>>endobj +251 0 obj<</D[303 0 R/XYZ null 82 null]>>endobj +252 0 obj<</D[360 0 R/XYZ null 552 null]>>endobj +253 0 obj<</D[360 0 R/XYZ null 658 null]>>endobj +254 0 obj<</D[360 0 R/XYZ null 499 null]>>endobj +255 0 obj<</D[354 0 R/XYZ null 645 null]>>endobj +256 0 obj<</D[360 0 R/XYZ null 447 null]>>endobj +257 0 obj<</D[360 0 R/XYZ null 381 null]>>endobj +258 0 obj<</D[360 0 R/XYZ null 328 null]>>endobj +259 0 obj<</D[360 0 R/XYZ null 275 null]>>endobj +260 0 obj<</D[360 0 R/XYZ null 222 null]>>endobj +261 0 obj<</D[360 0 R/XYZ null 156 null]>>endobj +262 0 obj<</D[363 0 R/XYZ null 763 null]>>endobj +263 0 obj<</D[363 0 R/XYZ null 711 null]>>endobj +264 0 obj<</D[363 0 R/XYZ null 658 null]>>endobj +265 0 obj<</D[363 0 R/XYZ null 605 null]>>endobj +266 0 obj<</D[369 0 R/XYZ null 724 null]>>endobj +267 0 obj<</D[369 0 R/XYZ null 618 null]>>endobj +268 0 obj<</D[363 0 R/XYZ null 499 null]>>endobj +269 0 obj<</D[369 0 R/XYZ null 565 null]>>endobj +270 0 obj<</D[369 0 R/XYZ null 499 null]>>endobj +271 0 obj<</D[369 0 R/XYZ null 447 null]>>endobj +272 0 obj<</D[369 0 R/XYZ null 381 null]>>endobj +273 0 obj<</D[372 0 R/XYZ null 189 null]>>endobj +274 0 obj<</D[375 0 R/XYZ null 763 null]>>endobj +275 0 obj<</D[372 0 R/XYZ null 295 null]>>endobj +276 0 obj<</D[369 0 R/XYZ null 275 null]>>endobj +277 0 obj<</D[375 0 R/XYZ null 711 null]>>endobj +278 0 obj<</D[375 0 R/XYZ null 618 null]>>endobj +279 0 obj<</D[375 0 R/XYZ null 565 null]>>endobj +280 0 obj<</D[375 0 R/XYZ null 513 null]>>endobj +281 0 obj<</D[375 0 R/XYZ null 447 null]>>endobj +282 0 obj<</D[375 0 R/XYZ null 381 null]>>endobj +283 0 obj<</D[375 0 R/XYZ null 315 null]>>endobj +284 0 obj<</D[375 0 R/XYZ null 262 null]>>endobj +285 0 obj<</D[375 0 R/XYZ null 156 null]>>endobj +286 0 obj<</D[372 0 R/XYZ null 242 null]>>endobj +287 0 obj<</D[297 0 R/XYZ null 698 null]>>endobj +288 0 obj<</D[375 0 R/XYZ null 24 null]>>endobj +289 0 obj<</D[315 0 R/XYZ null 152 null]>>endobj +290 0 obj<</Type/Pages/MediaBox[0 0 595 792]/Count 36/Kids[291 0 R +294 0 R +393 0 R +396 0 R +297 0 R +300 0 R +303 0 R +306 0 R +309 0 R +312 0 R +315 0 R +318 0 R +321 0 R +324 0 R +327 0 R +330 0 R +333 0 R +336 0 R +339 0 R +342 0 R +345 0 R +348 0 R +351 0 R +354 0 R +357 0 R +360 0 R +363 0 R +366 0 R +369 0 R +372 0 R +375 0 R +378 0 R +381 0 R +384 0 R +387 0 R +390 0 R +]>>endobj +291 0 obj<</Type/Page/Parent 290 0 R/Contents 292 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +292 0 obj<</Length 293 0 R/Filter/FlateDecode>>stream +xÚ5ŽË +Â0D÷ùŠYê"1>·J»ÑE%®K_Vh‘þ½IQ†»ºçó"ÜG •P Ú9r(sˆf€PœÅPiÓí +]¡žº±wÐþ;£¼˜óÞܽAˆ`d1S B1ùSjM%ã¢2b¨LX´ýše…¶ƒû4sj¶Ý»uK +endobj +293 0 obj +158 +endobj +294 0 obj<</Type/Page/Parent 290 0 R/Contents 295 0 R/Resources<</ProcSet[/PDF/Text]>>>>endobj +295 0 obj<</Length 296 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +ár
á +ä +endobj +296 0 obj +31 +endobj +297 0 obj<</Type/Page/Parent 290 0 R/Contents 298 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F3 5 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>/Annots 13 0 R>>endobj +298 0 obj<</Length 299 0 R/Filter/FlateDecode>>stream +xÚU]oÚ@|çW¬"U¢ +86_!íSC“(*JÓ„4¼ö—ØwîÝšþúîúLb ©” +²o¼;;3çûÕˆ ¤OÇè Χ“ÆÑù D'0™ÓÊà¸t`’4/•3:)b'µú8y P¢ÈƒÚAÐcÐd‰pv{
÷2Y ƒ[úεóñääF¯d‚â%Æ0+œÓªs™"ÝÒÚ¢iÁÓV×|!TkùGþã‚–«qó³I#BbÎ?ÿÜ\@§?º0èö‚dÐv‚“ê*…[ž‹¦éöé’ˆ2£ +ŠŽV5¥Ï dš–dá*\E!%ÊiHô'ß8„žkÎ{®Ýéù?€_Œ6‹Íà西_ë>¯]MÎn¶Çh—ÕªA.}`÷<‘–d3‚ !§[*òt)ŒJØ™¸”eMÚ*ÝÞì +;Øñ×× o°…‘Z
3ôºÑ4˜¦ÕHe+¡jòPf) ë%šÒž9%ž2§E‚~[”ÔR93Ôí®ßm%NÝR¬¨sÇhí¼HÓ§—$[Inù€º§ßM.ðîLÒH³B¦žBí-ÂC‰Jü-²<ÅÿßÞÕkâŸgTíTëÀZy…ãÀr‹r„Ü#íbPÚA²’Œß uÊÝWä,|`ì˜ûRi/Àï¥:GUÞ: ±¶;oQb'`&\¼ôE+‡5!zǯé½aHgXÈKQuÐýhü‘U\ƒendstream +endobj +299 0 obj +848 +endobj +300 0 obj<</Type/Page/Parent 290 0 R/Contents 301 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +301 0 obj<</Length 302 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨J#˜‰‘¥ž©˜ï™WR”ŸRš\’™Ÿ’r
á +ä +endobj +302 0 obj +110 +endobj +303 0 obj<</Type/Page/Parent 290 0 R/Contents 304 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>>>endobj +304 0 obj<</Length 305 0 R/Filter/FlateDecode>>stream +xÚVMoã6½çWÔÃ:E¬ÄΧ½èe·»…/[´uÑ´4²¸¥H•¤ì5Šþ÷β-+6E.¡8oý÷Ånèoc¸}€¬ºø0¿¸þ<Ñæí<<Þ§c˜çƒy‰ðY*„¥1íåü+ÞÁh‡ã‡ôn7oÚÍçLÀFæ+ôP[³–9:à¼Ð¹°9ÜÍ¡ÂÌK£!—B™ÆÂÖ4D]+™ Þs)Ì<¸¦®õ|i¹¡ÝFø¹, +´¨}§be¸ãœÔ+juÜï +ªFyYŸØ | qÓ¸0¶Æ!HÝëž8±F.¡^¾‰˜—i$ƒÈ¾OŸZoŸ8~VQߊІÐÿ—jé`)æÐÔº`*3%œC7Y›1~"ðû^‹ñÃã©f¬Ùœh6¤)P'&Ú,C0Å‹ +êùL_ +J:š'óL¥4—ª1“…$ô¹´Ä»±[ Ò…RœÿH4&nåÝuezm¤¦J&ÔØ:Uz|ØáQî¹ÃžaöpXO)åª*\£ŠÄÆ£ìÎ!–7Rçfô”íQ®ëæuL³¬¯= Ø~ßYR$ÈJ¬è–ª?-Ÿ3iåÃ`©ªÉ¤ðè^°Î³òÛšˆÇoµc¥Sª/©›á«qÀë7kl¸–]FhtŽ6€ƒß~šA’^& +^FטnŸÈÃH†ôä¼ff§äio9¢Ç σ¸¢´ébI}#Tté ɾJÛrÒ;¥àkã|plB}Ü»søŠéT‘?Gûx½ƒÅe\…¤ôœ!qx‹©õŒ?‡×+VyßòØ.cpŸ{¡ßyXb(G’¦p
+Ôh©\8K¿0Š.FÛMÐ\‚üwdÃlÿÝh:¾+ÍFso&¯ä·)ﵦVÕùGê÷½œ:Ö›8ÿd™ßox¹täŽmeEu¹™îŠLqAPwýwRgª!WI:¥Ó2i9AišÿÙQ0âÀ+Ã××ðsÍʪ_Žˆ)²Å ©…/ù~%W|ŸÒÊ£Õ´`}Ò'/½Â„ÊöêYÊ#{ +Õà.-,8«äâŠn"ëvêœ-CöÒ-sp•D'GIÿƹ?íç>¹?Iÿ—êÝÓM:!Òö-¯?Í/~¹ø½Xendstream +endobj +305 0 obj +1069 +endobj +306 0 obj<</Type/Page/Parent 290 0 R/Contents 307 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +307 0 obj<</Length 308 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨J˜‰‘ž™˜’‘ªà–™“ªàœ‘Ÿ_œZ’v
á +ä +endobj +308 0 obj +114 +endobj +309 0 obj<</Type/Page/Parent 290 0 R/Contents 310 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +310 0 obj<</Length 311 0 R/Filter/FlateDecode>>stream +xÚTMÓ0½÷WŒÊ¥+µ¦é׶åìj‘à€àÒ‹“L“a;ÄN³ñßçcÛ= ¡œìy3oÞ›q¾
˜òÀíæ+ˆóÁëpðò~ÁÂ=GV·K1ƒ0…ªޒT&½ ¿2nAÐâ&³•Xô¸68í‚#Ÿö·¬Ô”¤è ![(y´ð~x{RhAê¤R¦¶à¸de±g V?‚Ñ H?Z“Ðò@©td´ðÜM0o»~S•%j§ŽëÚú31T˜ó=Ó”¶* +S:L +endobj +311 0 obj +563 +endobj +312 0 obj<</Type/Page/Parent 290 0 R/Contents 313 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +313 0 obj<</Length 314 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨J3˜‰…Èt ?$#UÁ#5§@Á%31'?$ëÂÈ +endobj +314 0 obj +113 +endobj +315 0 obj<</Type/Page/Parent 290 0 R/Contents 316 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>/Annots 16 0 R>>endobj +316 0 obj<</Length 317 0 R/Filter/FlateDecode>>stream +xÚUßoÚ0~ç¯8u/PAH€ò£]‘6TF¥nëÖt{(Ue‡xuìÌv hÚÿ¾sÔÂҮɒu÷}w÷ùîò³æ‹èö!HjïýZ{:o~„–þàÈé€Öý˜ÂŒòÞ¥)g1L +˜×#®3Í
ÿâzày®Õé;½-®0º¥±nieR‡5—Ô@ªäŠ…TÍ’”SXÓ,”\kª€<FoB Ý 31,¤¼Oˆº×MËñ°¥©T¦iaF^·¨„ˆ´„M±ù5í§÷$20ð,¤aØ EÈ´Ql‘åæ&Rà,#–k02M§`E}œa©Twh³:·¥$T˜<Âÿ““é\&©1[¦+ªG«QQ°bR%y‰Ð…&3ÿã¬EÇ%Xóºõž–1â92/6¹ +™}CŠêÔš°Ž>odM9
Êð2ëý'±ÄŠT5q.ò™_s›Ûž=¾~ +žo@ +<lß‹åVû~$ˆiØ´MKÄfïY±eÑ•ŠêŒLR ‡¢\’ðù~»¶Aò +Êþï¹x/vž–™ +¨×Í&¯±ÿ,0›õñceG;.œV§W”ñ¦)8(Óqâƒm¥ÞŽÃÛéEûÁ™Kk'‡3aà¥_»
Ÿ¡gÌ€ÆËôyB˜˜$D-ƒfþñŸ²dKçg*ÁFhq&¨ÅdvtwIs`‡è°º¹7*I'ÿ¦úµG¼}²âwˆ«éd—7ßÔO6V‰ïv|ÄïdJÅn”“ͼ>oœìè § èzlßE¸þZ0>…NñØ©ZcÛ„¹ÛêÆ»ŒÒÛ©JaÊU&ªL!Í÷>ù;-EM¦ì—É}D9ý.ÚoXvg˶Ÿ×ÏçâUŸ·ÞÐuF8è=(7Ì—Úˆo…endstream +endobj +317 0 obj +774 +endobj +318 0 obj<</Type/Page/Parent 290 0 R/Contents 319 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +319 0 obj<</Length 320 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨J˜±©¡ž±˜’‘ªà‘šS àXP“™œX’™Ÿ§£‘–S\Z”£ RíÂÈ +endobj +320 0 obj +129 +endobj +321 0 obj<</Type/Page/Parent 290 0 R/Contents 322 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 26 0 R>>endobj +322 0 obj<</Length 323 0 R/Filter/FlateDecode>>stream +xÚVmo›0þž_qê§TJ(Â˾ݺN뤽 õK¥É'x1˜a(Û~ýÎIÓ*U”‹}w~î¹{Ìω&~,ðlX¸¥“Ëprq€@¸Æ×[6„ñôŽÅZÊóð®;`YÍúÜv
G‡ …Zï‰_–E¼Š©Dã„ÊH +$‹!i.$+»íÒ +HIF6Š+ÕœqAjõûQùz¤€xœÖ‰Ê·q¯ÂÅ¿ß±?¤ˆÇ +1>Ùäƒ">Á•…§oø…¯.÷ÆjÙêOë¸z§nÌîà|J]çuARZ‹b«1ÚqïÌR©#‘;f·ÃtÍeU¬?Fë4Qù\p Çe¢“ô/¿mOû}™¾ÓLÚà-ÚñM#ÀEü7hëöyòOPÿ©endstream +endobj +323 0 obj +857 +endobj +324 0 obj<</Type/Page/Parent 290 0 R/Contents 325 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 29 0 R>>endobj +325 0 obj<</Length 326 0 R/Filter/FlateDecode>>stream +xÚ”]o›0†ïùGÝMºj>àb7íš®Ú&mÒn"UÔ8Á+Á™í,Í4õ·ïI™”Eƒ}Þã‡ã×üp| xøNÌŸ®œ«Ì¹œ¦à½²ŽMâ²bD«\)¸.}¼Úh-êóì»s“9Ä3!Ä‹ Jb¼ð”}¢ÐÚDaàù&Õu“ê=g2—´Ü™D—S©
D7ˆÌ}1šV÷·RlÖ&„€ë7r +„.™ÜrÅ +
Îý1oX²¯Á'¦KQ´¥¥0H0®/Á<˜Ä°·šÒ\|sùz‹«€® +ÓÓ ÐFö¡‚™ñÙ@ —°çõˆ±ƒ¢îe¤—utnŒþï+p +]2ñÆHçÒ?†â¾›YžOàK;¾Æ˜mñtó¯5<=]€iw;Ûn·¶-Ë ¢V=’Kx]Á[ óó£Ælâå†j4•,×h9ý?†Íu£SkFù‚³ÖBq³/ ¯PüÛ{hòüâÿAŒ›¢nnÅÎw8ÛB2³sª +Vl%äǯÌî%V›AñM‹–(i'ò½…‰ýÝÌ>Ã7›t†ç'œ~Ì>kCÝ8 &Ò'¦3LÇ^ +äØçô‹ó²ö€tendstream +endobj +326 0 obj +595 +endobj +327 0 obj<</Type/Page/Parent 290 0 R/Contents 328 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 35 0 R>>endobj +328 0 obj<</Length 329 0 R/Filter/FlateDecode>>stream +xÚµVÝoÓ0ï_q‚—–,_MÚ^+L X%^*M™ã,FiRbw]Úßδ]F»‚X«Æv|¿»ûùÜ\üzûDÀæƒÓéàd2oèŒ`šá^ašZ¬H¤„‰(øi]$¯¦ßgÓëˆë„Žbœûø«9dkCã·†ßñÈÔ[mêƒàuR³¼!C'ÆFaØ~HóÔšW[Þ\°=m +¾Ø²ìä/öÇ%«ÅB‰ª4r!jJ‰íG˜8”™æ:¿fó1öNÍ‚•Ho¸‚TÈE‘4(„TPe¡R™Ì¹<†J{LŠ¢Ay•ë-[.8™` XUJ§ÛÝ þÄU^¥m2XëÚ¡ÜôÌbØÐ +¸$nôêØDˆÙ’æ]/
5wÖ¡³cä¬mb9]0c°ˆ.r‚vq :×5YºVx£È"¼Ø_/ƒàI’]eñ“ÿhq€)›Ã0ƺšÅÐâeÑ ÒQ=GÎ"›‘>fq °È3Ý©¨’t¬qK7…ölQ`f‰RÁÝÝ1ÐØ4f\̘çÇ@QÀò¤†W¼wv´·)hùzÉTU«y¢¸õ/Í"QZ¯m +»gÖR'Tdî†0æýFnvdº3€K®$ òu¾P+ÍMÏd–,e¶…ß……¸ã…|²aýÌÚ¦Á"Qø®|~[¦Óûû +endobj +329 0 obj +835 +endobj +330 0 obj<</Type/Page/Parent 290 0 R/Contents 331 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 47 0 R>>endobj +331 0 obj<</Length 332 0 R/Filter/FlateDecode>>stream +xÚì]koK’MO¶)NÑ}û´f¿ÜÕêc0Òh%ÓÀßV»HûaµZ!ð1Ɔ]4?~»ºªòù¨—ÛU™îW=ݧ"NDddÔßî?^nÿ¯ž<+þzÿå»ûÞ¼X=~zr¾z÷ëvÛ³ç/Vï>þüáËûëëÕ›Ï_.7Ÿ¾~½¾¼úçw¹ÿúÝýÓ“b—Ó“õj}þ|ûùlû¼º\ýÊOôää¬:Ñ“³“ÇÅ©6»SýéóåÕû«Ÿþ^œèÑ›ÓÕ‹rÇí×øål]|þøó›/ÿóÇ«¯?¾»œ®~y¼;|µZýC_ñ/¿l[y¢Çõ‰~Ö¾¬üm~)þË“Ç'Ï‹ãßþöáË—»wíø6ÿô¹Úñ÷Ò™O>ýÞyòW—×®>ûþùëoå~ëUñ‹ùåìÙ¶Û¶û¼ût¹ªÿo¹Ñüîõa?¯þïóÇ?_~_}ü|ýíËû¿_¯Þ¯®¿¿ÿíãû««_·G®/¿\~(þßv—÷_¾þyõýÓûï«ëß¾}½ú~½úß÷WŸ¿þ¸–vûë×—×'ž[¯Ožì.‹³'§'ÏVOo—ÏÎηèÈÛG›ÿø¯Goýû_®¿øÃéúôlûܾ¾Ù¾ž]œmN7ë‹õöõ鳧ë'›ó×盧ëâóÓÍÅë‹Í³õ˳—ëç›g/7Ï7›³Íú|s~q¾y±~ñìÅúbsqq±Ù¬‹õ›Íë‹×›WëWÏ^_¯_Ÿ½^¿Y¿yvº{}³þ×ÿ~ôvõýêÇå£ÿ\=yñüÑŸVOÎνü·Íê|õöÕ}–Úµ‡©íKÛ‚qx”þöâïw[0Žî+å©ÝD»{§ +ö9¿*jõ%Ýé+=pÙÏPûÍÕ{ÌoÙ}S•î-;,Ë¥ô¼§±BÙÛåµYñ+d¨øu®m…,Å.¹ÂP—˜"P»z{ZV¼ç¯þK¥Ë¥j]±C‰5+Š4gB†÷W2–êâ=C2˜Ê +¬ÞŠz«~%KÇ¢@à +Fe`9Àख़¬’5¶·¤a¨©Š3JBQº»Vß|«$7yÝkÐ \ÜénJ†AÏLéÌzêe¥·åkŸƒÛÅppWD°¨)ÅmfÂǶ¨)Y2@røväŒK#ÓŒh¹g™‚DfHÆ- +V?ƒåv‡JÞ|ÿ:F`ãüýl÷´f~0 ¬ÝšÚ™¶v?ãŽÍÏPÔ—:–×bRïü³`˜ÜfÚJ&î>£OIö3d¯J(ÛV™Q\Ž\í^È$6Ù¦Ð?ÛWÈë™ê㶹ÝÐ~ îÖ©ŠC“épfƦ¸Jû¶ºÞç-^}¥ò¹ôû ÏZ=Á8涄C¸¯ÀÌ·o«d㈤üÐB‡¥»•U°"¢2XmgÝs±Ð¤³ñ9„NI†?„«v‚WoUãöc÷™1`thm=#qˆTÜGQý=„îéyª¾5¿òÛ$å‚Ü¡&tJw›å˜®ù?Ì@aégTxég€ ²ˆî”8CaµÛ„Îh§¦ $üŒÒ°e®„¸yۦΖÙ(ZEÂäV8~j¥Äœg¶GmaÚ5|¼2–yîÓj+x pFI¡§¤fÇØÐr»¿’¿–R›L +‹q…Ø_3ns*`Ïš3ôºM¿(ŸãÆ7ìds»”ýýC´”2O\
.…d¡#øª ]DŒTI¡™ª8CmwÅYj=·¥0E 0¤p{j½69Q‹£·§Öa[hM:L•ŒF×m©O¯´KhÈœ‘Àè=Ña©Ç¦EF‚ÁÚÙXB§5²µK†Œ…ƒ3Š]R¶ºdˆT™ª¦œÁ¶P”cüƒ + Æ÷ëR#Ô«°Eટ Œ-¬ä›Þ*^$0øºÔ¬` v¬+É€aÚ²BYQ’±“‰ísn‚Á_mŸRÓÀã᪚Ҭ)v¨¸Â…‚Ú>ç¦d0–Ôì’yò¥†ÌVkª„ba“¦}fÉæò!… +vr±#ÁAƒ!d¹d@WSœ4Î`óÊ{Ÿƒ‘àvúl±).&g”Ô½Cdî +†iËÉ•`ØûWò¶™e]j2zÚ³ðÀµ¨°¦LÎ(¨›ó?S¶hƒK: +g(Ú½ 5%s†B78#AÑ+Ó–Q±©E¯`@Ïp'(º#«Û§2žA‚!qF‚b 55³‚‘ÆÀ{j™èƒKö1ðÆ€Ö”+!Á6ž<¹®ÁȬ ÎØT
Å"¡Ñƒšò¸…3vP,R˜£µdHxd2gðG„dHcà;(vp¤Àésù +sp©leRˆ¾:u~°š +Ï8æPÐcàÌLNHhP’‘qmUFm!W|¦çgp0X5îvU>&0,’‘5”Œ¹{¼’ŒJ;1±n§ÃjM&žub½?cÇb™É§¤Ž)Jªsq—Œ¹Œº'<áÉ`0i3ïýcõx6Â$,Û” +’‘ÉÂAŒgxýŒyJÕéÇG£\Ûy‚¢5•µ‹MUmS~H—ÖTFNÊ÷äÚ¦TÕì5 +É1ð”ª3°5å®’ èØÏÈü¦mºçRï’‘)ñ)ØïFÆ|µCRëž32›Ÿ¡UÕAJÕéŒL\Êî¹”Ruz$ðŒæ¦ß©ªN¿~†âC•iú±ÍÏH©:rFf1mGTl*UÕéÞÏÈ(5¥a‰M¥ª:IF¦YSF][CM!UÕ(bÞYƸi¢µvÈPUuFFFYSÆœ>½©yJÕiÏ?#°ÞÔ0UuØtÔTBÇÍUÕ™JÞTæ¼KÀ!k];D'ð”ªcª©Ì:ìªsÆ!c¾Ú!)U§kJOï´THÈo¬ªÎ©èÚ!CUÕ™š5…øù)U§?5åÈ¡8#Aч5÷ÍÙMÎHUuz±¦¬Yè¾ûg¤TcSö‘>¤T¬)ßv‘Ru³¦¤@!ÏH÷\ºA5¥Ýs‰œŸ–Zg
A±)úžK`àIŸS‹oš5Û=—ìµÐŒý”ÐèÂéFn‚±ƒâ'–àh F@lÊ +%;8RŸ¶–ŒÌs£]ÒÏØÁ¡øI£f&”uKùR£ÕTf›zLçÚ–`ÔP˜`H4®g,A€‘5¯Á(¡ Á°~N`8¬©Ì‡Ì|cà¡`Tý^ê, Æõ•ûÕ†s¥õ䓱Ѫ)™3àŸÓFÝLÑWÖg}ôTö— +÷ÏÈ”º¶y4gP’ATÕQÑbÄû±uyR’±°ÿ +ºçRì
°\`8êêŒ[22#;8cyÏ%'Çd])r‰æŒˆGfYë|& +FÖ*6Å |XUGó3BÜ‚èh \)L&œ1_<\„š¶šÎBLÛ)€¡»Ö9}œQS)6Õ‹]£0AÑ‘šÊ˜±)DpÛZS©”KŸÖTøxFªªÓ1ksúQ×6UÕéR2²èÁ%¤ª:½€a\BüxjÝrF˜‚”ªÓ¿5Zü+O7ÀêY2²Fó3d(’ŸÑ™—ø¬sFJÕé:6•zàH©:Ã9}ˆ0U§>|”¥ßÚõªŽ?6µƒÂŸ p=cÀ`ãVSMýŒSuˆóÀ›rFµí?U‡'ë°Q¦’œØ1ðyìý3j}•ª#¶YMµð3øàÒ|ˆTøéqB¹Bb8c>TªÎÈÁÐ9Í8cy,'Çî[`ZMe
²CÌûô͇HÕ™ˆd´ð3|¦mg©:c'pGFaŒŸ2?£uªŽ0m§ ‘µC4Æöm +¢ò¦RªNÇ’¼VSˆäŒ”ªÓ)°©©Y Ÿ‘RuºCª’'ƒðñŒáRuØè%C`ÁÕTìxÆ€UuÆFÑ©.ˆªªÎÈ%yE”5…á«êŒ4EG#ð„8]oj>TªÎ¸)&9}¿ç’"‹Å`©:cVSܸÍX㼩¹_Mu—ª3jɨñ¨À@³1ðáRuÆ +ÈØâj‡H†Ýšjª3R02µ5ô3B‹uPUgÄ`˜¥êcò¦Ò}znÁw#C^™ªÈ{^/¥Ö°UΚô˜‡ûöaôÖ0Â'ýKC8úþ¶þ’ÞÜ}éÄT9QßHßPƒ{£3Ôw(‹yvwOB}hë'Ò _vZ'»$v@CúÎþÏÌ«ŽK媿ý8Þââó3èބ킧®„\}ÍÍ5’öPO…Ìésž „ÔÀýU`Sov¤FÌßí3mÅ@ÈîÐK·éõñÚS°þJxµ«÷eÒg]çÛì)X9–cô£IɹõïžÔÇ +u—“Où#|R@™Àº?£+¹Ûúîi$õÁ<‘ ÚÞe:aò&Ò7 °·GmQ¡*g”"Â6i¹ƒç>Ø,ßè/‹aD3\sú`€¡HF^é š%,’áðà5Ö·k)ŠÚmÞ–õÞkÏ]׶ìp`ÀPW60¢.qh…žgÏ×Ãßj +AÔÆ2ƒ´ +BÁY‚'!Á)•âI…w[Öû A8g˜¦m%ÅbñÈ%év ¹ˆÌ·˜×™J§ÔÕ…!Ä>CðvâÖ‡^É°FfAF@@©{ÐF…»ßÍpßóõ~†ñGm̸ž!jä6“uYbšŽN§oûÌRë¹ÝN´lKמªS€±LÏæŸ ôwc(0(CåÖM¯-–q¹¶Û#©)1…¿8 &”àÏÝÚÚÊFO`Q\)ÓzÔ`„VbÛQ_¼%¼H€i+“dÄI¢¶¹ p +ô3Pù:ö.µ¡Y[N0“$ð…ˆÝºüZ2ìÖ(0¡¦&Å)ÉMÔÖõ–e…ÀS#¸RªÓàÆ´i«ì§›¶õ3Á +“õÅDm§Æà%6åŸÓ·c1¤d,¦äi!ôÙžŒôMÒ®
M!WGúpF'‰K\‘á _µù¾"ÂÀS¥•! +¹xMÛ R—ù"úúœ×ÿaz‹yDâsjÃ5ÒšŠHyNõ|¦°$6[å‘&««‹Óy¨—»wøžÌ=·`„M=®0aB=pcš`ÅÉ@Ì¿–R_ýÅ¿†»:&n.øÓÕO˜$Ú¯ö
»æÍ«5+£8»ÊòÛ}¦íJdÒÜ-O\ªQHW.誋õâUÔ,”ÁZ»xX—¹e-üŒ(ÝÓ¼Öë°ŠJ»¯dXËʉîŽUÎ<¸ÔL*:=7FäÚ}%ÃZÆškœÅíô‘ìv"”ÙM±Ç€é,A±)›oc Q;‚ò1y©:4Ò_ÍX¥âZ”„Œ @aÓË5œ‡q³b±Óû
þ{gj +§fטîõ€P@{£CëÒeò«XŽõ4¡›ÉðxEl‚ÙÑÁI5eÌò¼ÀÿÆ»Ï÷Š¡íeWëí!¦A:žÑwx£¥ÐÍÝu(rMô¤l7\}¯à IÁÈRå‘%iG~‡p¬NbP?Ñv==ʾêWG©ªÁT°È+0ò|)u£åØ\8+-›ef3~Ÿ>¢|O´GìU*¯'± ¼ÒMuá9&}õíçåNE•`(.v©ÐÖÕè¨÷fœÑ.Ú„ˆ¡BaîºNm}’Á¤brråk hÇBei¥”cn.+œºz'h—,Ú@ +Z×þèm1LM1åŠY–~†nMijʆX&~Á>%— ˆ‰—ØÛ.Ö¿TSW7䊤%OË»4üH`@0›KÏØ”ØTˆ5…¦Z*ØϳQˆ§^'‹²5•KŠ_ +ÓV‹MÁFhˆ3‚>h‚ŠMÙ†bXÙTi{q×Cxi®Ø”k‚%èóÁc ¹y7®òpÏœóêV6:îi J†»^8lˈVS>ÛÆwCDë]Æà°_ƒJ©v(›rlŠè={àF€áÈûÒÏ {¸Q‰MÝW#¢AecâLdµax̯õ¨-BŒ¨‹¦;}A
¬ò%‡ÐòÇŒ9å´ªñ‚ˆë•vÊ;\DÀ˜BÆ3"ÊË=húGïŠ&€SúJ8Ûe!OÐJ^yÑ°]dÈQ[Ð{Ó]HŦ1V"±}Ÿ1:6Tº<PQ!LÏA/zJŠ,Õj®$£eÅgƒ3 +É(Ñ(^g, ö HUHpkÈÁ؆՚«¥–Í䌣‡"2g8¯\Ÿ8nóˆ¡tCâ{ЬœQÀTrF|È#>d’°€žµTÞnJ×J’QÉ…,dÖ¥“•{¯çÃ]’M'WäMÒPrmuÉŽÿÁAÞÕI!F³a~µYìgtIp?CãŒx%âA Ô`…ÇùèЬmÓ«oiÚmÕ”iM‘¶'h_Àn[ûn¡{wµön^˜}<Ò•ì
KïB’ÍÏÈ#†ˆš\ržÉ8î;µ—t¦_Bn”Gà†Ž˜XqÎé;ýæö›ZE¨†F†*âÕPËx&hÎ8z8“–…;º!ZXà–’Æ ®Áü 9%AŠŠ>VjŠt +v&¢h2‘ƒïÐ׿5tá o.ÜÆçŠÀ禮”Œ;f›Ý¡½EÚc&ï8óïO®™ÙvŸ©{D,Òß6ºÍZjfûX€ñ»Ôö¤¥{åíSû +ä +„&˜(E,ì!·$“V³ùŸ‚nK9¶µµØdÙ´õåι¾î|«Ÿ2ú]v¤Ë6ÉâZÒè$'é¬Â[Lé¤@-6ù<)·D!žÊ‰“D<AQ‹MJ׺p1Ùƒ¦DŽI"3Ñ\¥{=ÓsQAr™ð;C’ÈE%j±IÕtu9¸î}r6Ü +endobj +332 0 obj +7304 +endobj +333 0 obj<</Type/Page/Parent 290 0 R/Contents 334 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 54 0 R>>endobj +334 0 obj<</Length 335 0 R/Filter/FlateDecode>>stream +xÚµ—[“Ú6ÇßùgòD2Á±¹úÖl—4SšigúÂLÆÈ«‘%*ÉKèC?{$›‹¹,ÛnfgÙ>Gÿß¹èþjEâOqzC Eë}Òz7!E,¡; +º0õƒ$Y{ÞÆð:ù³uŸ´Â DGûÙ—‡è„hÛCÛâAU3»iÃAàݤ_É òNÄÐo†H.•Ú;…;§š£C'ê!álq-[hƒr‹Ùâm+¶¥æåÑqÐG´á…üâF´Ám+4Íþ¦/Öï£mƒ~0®7¢õ^Äl×ß«‡K‹5FG¿¸«ç$S^~ª(ví?½jq#U4òíÿÈ4[ð‹dãš}:Ý¡¯ý„qz—K©©š·‰Ú +XPH]Îöåʘ¢pÖ4EîbÍ©¡°D2ÿþ¼ÍlrFrÜHS‘JQ½–"cbåm™†œrŽ¿qÑÇr†iK…]7ÔíSëè4˜X——”gÏl#Ÿ§!Û +=qÓïÓçé´é„u²A`ø
ãWo^5m¬"âÜÁë +q<Tôæ²n àX9<3Vdý<M>>GÕ« Šëêç ß=Üÿ˜¼D¼–F¯)aË-šºÙÔ9Ný¹Û1t±Æx‘#óÆq9Xà³w¡k°ç$lLnª|Oß?GsöÊ„ü‰â¡“[Ÿ®
ËVÔ‰¥¢8'íá*ha“a±f.«>J–û@4oOø—;ûÝ©‹¹äM¯àͨѶ<+û×".Ròu¥d)*¡úØœIÝ{…mpš:;5.‡`ï‚Û›«Xoá‰DY,¨ãð]†i:læKiÚüó×àIÒ|Ÿ“;RâUñíÜŸ@Ä0Ì™kÚ¾«xµßaÛÝC~“zÐ>Aš³Œ^Õû
ôÿ9c£êíh¹o.èûÙoð‡?3;ÆöîqCÃvânèÒÃS¡!Öí÷÷<êUÖ~oýÈQ‚wendstream +endobj +335 0 obj +956 +endobj +336 0 obj<</Type/Page/Parent 290 0 R/Contents 337 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +337 0 obj<</Length 338 0 R/Filter/FlateDecode>>stream +xÚ½UMoÚ@½ûWÌщ„ãCÌ•(¾´‡¶±ÔReìq½ÕâMv×Pú뻆@ Æ ¤2ëÙ™7oÞjg^<¡~Œ&æ—/½YêÝ%S ÒRïLâ(ˆ!-ü§Ðœ×’þÁ¹ßäU&@ÎonÒ_^2 +†ÆÍÙ_ýœÃ]íÃI×'T¸€Ÿæ_U&xi×hm?DØBø e8|-Q‚ûÌ6P`™5Lí`.• Q9`Š.Ñ&=„Þ+Dáoõv ~ྦྷÇ%Y‘X¶@6÷M +¬·ìH§ƒ]p‰TŠ*†°Ðц'”zï„PçoÕ]‚@™gu'¥oÈxV86y#Ö + +*0W\l.?¸n>²âën´ƒ¼LXÓºàë3™¼9g\Ìý„ýx0+ÈNs·µç~Éqnì—;v›©G%¯ÕöÊ–'®ì«ß nõàݧ՜¾§ÀÛ$:Ç{ó¬¹PŽ[«Ý¿†«‰4íñ.ù~÷Ye¬ÁÃvõœ©ªÎ–ØÙµÚ8SS©)ôñ½¦jº +™n0XØŒ§Ë3œVTÒÃ3=L5B´¼ªy˜©Ò&²lS/BõÌŒâ{½êW ”n®Æm<‰I@à~O_à;-tå U°½<ùœ~2xç8h=IdŒ£é4˜€5ä,“þ¡©I|õþ/Ö<Äendstream +endobj +338 0 obj +524 +endobj +339 0 obj<</Type/Page/Parent 290 0 R/Contents 340 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 74 0 R>>endobj +340 0 obj<</Length 341 0 R/Filter/FlateDecode>>stream +xÚµ—MoÛ8†ïþƒî%=X%©O^»mv‹ÝÚ½‰ŽYèÃK1uÝC{‡ÉN¶àAA`E‡©wHÎÿ+ÿ8”Òênõz³zu-çI›-¶¥„MsU·jáÚ´ú]=ô/7Wo7+–øv–dU%¾üY
ÛS”4S”T$ÜÇù=ÄùÓh«l½;ú@¯®9HrD†µÈü{sõt¬§ÁÖÞ)åIéÞõuûØè +— +Ù2¿bÁˆd+d"g¶OÚ:ýyy¸<Y—˜8dDÂåeAÝjõ‹–‰yu2"¹²”R ±ê°<–¤þ'OF$VÊHý[Ó?ƒüyäOXÁˆÄâ%Ékìè–çb"HŸÔŒH.–’ôÃa³8—¨$íý~K"#ŽKHFª\î¸×˳!TØüv!#’,Iùí š»3Ë£)©ßïddD¢©ß£-•³ ~Îý‡$+’O1~Z²ñ8:ÝÝ…Ìòø”ó EF$cZN©à?ï»åÑD²¡ðZ##
o°!öÊ9m—¿lÎèð‡4‘dœS.ŒæËò)ÊeyÎ2â°¸¬(žeçàxç€ÄŽdDbU9¥Á'Õ>þ”KÎ\¡v™.Úó=óöêöå/KŸTÎ>Ön°P[V +z}ˆ-RÆí|Mã^×fk°1ýv°òeй^¸ük4b£O„áu8ŽaÀPùêfkµ§n[èt7Ø#•G;,zîµî}ÃPãÄÐC˜¹†©¦Ñxå7›"c¤Ì·7ïá¿PëÀ
þ|—ë¿7ù>kr]—‚ý¸¼ÍÊ?qhäù$Š«oÊendstream +endobj +341 0 obj +886 +endobj +342 0 obj<</Type/Page/Parent 290 0 R/Contents 343 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +343 0 obj<</Length 344 0 R/Filter/FlateDecode>>stream +xÚµUaoÚ0ýί¸PK(ctÓ>t]™ª¡i[‘¦I‘k;‰73Ûòïwg-L
ݤµEs÷Þ»»wî¯V + þ¦p>¢?¾h½›µ^L. Ma–ã7£ñ°?†™h»ÒXgLˆlû^dÎìF÷ѽÁ¨?¤èK!0ø)7kc¬˜®%x¾” ¸©€YË6]°Ò׶RUÁK£*/-…)ßÐB?™s£ÝÉá§å„øÿ%f%—÷Yóà¾ôØDIŸž÷OÄçÚ°ßlN—3ÿ¥˜Q(x„0NQçrévG¥*楃ܚ$Gâ#Mð§ëRixƒh¢ +D{ÌÂìAú ‘§ý$²« +UAÖÆ/²(‡z’6ki{Zæ¾d•8¢æÆV(ÙäûbŸžÉÊ(\K†ÖhhæE`;µŽÍ̳(ù™Â²õá¸ãce&z~,§x<cÜ«•„·6{¸îa¨Ûö¨J(Ž³8eÉéq&8 J?Ë13ÃVw¤d–N´¬ØBFMôÉo–¤êòÓ÷¬óæIaD†UQŽÉÂy^ʨ¶ÀÒ*Øcœ€ÀÿJ¯u¾qr_ƒ¿Ý¡»ƒ)õ kZ9bŒšÝIµqVß”($nçºi—Kä£ñl©×!—v¯@Jii%è<%[ ö®ÌCüv:ÌA%¥âdÏäSânÆXÈ4 ™8àw^jUàÐP/ìžòºBcÕy05òj®aÇæk ›btl[J®r…nÓ\°BÆû™Ñtto`‹jŽûÝYïšæ¹WGºðà”2´þ퇛(‰Èž9!âstÅbz–§ÙðfŠi=!q‹·ÍpÔ,Ÿ‡›ËAíd^k¼’qùj×໫Ò'í±õ¢súâ§Z¸“G·/RˆH@ÐŒV +endobj +344 0 obj +778 +endobj +345 0 obj<</Type/Page/Parent 290 0 R/Contents 346 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>>>endobj +346 0 obj<</Length 347 0 R/Filter/FlateDecode>>stream +xÚT]š@}çWÜGݬÐÚ§íRëZ—ô#1ٌøL…:3jé¯ïPWC7µ†Ë=çÜ3óÃrÁѾÃ1àÂz—Xo"&¶ÉÆÄÆIÚ‹hNbÌÙtšs”>ÉJ*R<Q‘«Þªÿ¶Ÿ|×À ¸®Á
4pàí‘î9M¡Fý,‹UÏ@à ¸1~µPç8Ó ˆÁ×ÅG0R°ÑUØçR'ù§Ì%RŠfj{•IÔN0 *#53C)œQö-l¸¨3L¯kS¦@Ò_äbA¶+ÖD +nö(ß]näú !Põ·Ó´`7pm†Á¤!ð…¦ÏDÁ£~
0š%õhMêÀ÷œúÉõ?mš„‘?²¨º¾ „‰õÉú
.EuJendstream +endobj +347 0 obj +502 +endobj +348 0 obj<</Type/Page/Parent 290 0 R/Contents 349 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 77 0 R>>endobj +349 0 obj<</Length 350 0 R/Filter/FlateDecode>>stream +xÚUßoÓ0~ï_q/,Yœ¤IúÀ°ÂHÀ"ñ2 eε1¤qqܵAh;gçG»hlk›Ä±ï¾û|wŸû{ÂÀ£/ƒ 2?¾ž¼I'ç‹9°™›@º¤µ(žCšOy™Õ5,D‰—Õf«OÓŸ“‹tâ¹ÆÀsC“˜Æ>] +a9À®ßÁ¾ËÐ[ôA Ê/t¾ð`Þ ÇÍ8Ÿ.ÊC,fÝàïxâ•CŸˆõ@Ó{T¹8&FÀÜØx_V¼Üæh7V?Âå…èO\·8yúÖ\‰²jíB0ŒM2?¢”‘MZ ôQÛÅ1ïÞi +;‘¯PC‘Õ°’´„„xVå"Ï4e]*ÐXRi¬uï·¨\0¡dU6‹åV @ï«>ŸA»W¡0-Ô˜ÛQE &jrÊ(nhÜÛ™Käs•… +Q–°–·h}øVÕRxSFÌw¹l3acSì†x‰™º?Ftj™õ tQ ƒ©,ÿYw\lïPêϨ™wýÃ;Þ~BvC¥¯ý(†ƒjHuæÆÌíÛ{j5NDîÖGnн”pe¤4rP+8¤Ç(—´7³Š978õÜœ˜ä=$î9Üâ€H!ñ
7ûòLnqH¶äîIróžœ^—·Áëz**
û½)™†¦iŸ»]û,Š3à’j ¼ "¿,á5xק +ÏÚ«-פ®$T?ØôO’ÞöÔ¹ NÉa#k14]-þà¡uÆ4÷Û²v(›–mÏ‚b-Ò2#\KÕ´j4Æ
©Ü,HN»ì[9鱄ÑÑÎX[¨‹«/𽽢˜*‹OéGãã´¦Nì{Æ’%f2d©ÀûÿŸÄ×É?vÝÄLendstream +endobj +350 0 obj +683 +endobj +351 0 obj<</Type/Page/Parent 290 0 R/Contents 352 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 83 0 R>>endobj +352 0 obj<</Length 353 0 R/Filter/FlateDecode>>stream +xÚµV[Ú8~çW±/LinòЇÞhGíVݤyAZ™ÄIÜ;µ˜ŒVýí=ŽC˜²3[µ 89—ï|>ç#_¸øõ ò!˜A²¼\ž-bð¦Î–>›E1,ÓQR¥`QþsÍn‰L/–Ÿo–×1®B8ðÚÇCRÈú0ãwaßñL Wm wŒJ"“¢1ž-\ˆ!‚˜ø¡¹NG˜ìueL\˜x; +VRuˬ3öqbx2ôkªÉ*Í·v!ĆŒ‰?CÊÐfYPØgµqïF°ciN50k¢h +"Ë@ßë¿$ku¿÷Ö5†àJSb"@ÊTU’†ñ4zÓ xÙ@Rž[FÓeahl†Pó”J¨¤È%Ù@"¸–¢tàR+¼É6D6PÕ²Š´Z€ª«JH
Ã][†ÐÑ€(* P+Œ¦Üê¼8Jˆ±3–×’A Zq« +!´¾(§óÚ³úBa¹º8™1XPPNlßDlø– ¤`e +«QjR"1ÿÙ÷è «‹ŽpåÀG²e¹- +vk/ëD£%’⬪„ø¤£ +w«s’ò‡snKÁ´í#)Qò7:ªôÎ&3n”Š¬Kßþ‡Â¥]âKÁÞ +endobj +353 0 obj +897 +endobj +354 0 obj<</Type/Page/Parent 290 0 R/Contents 355 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +355 0 obj<</Length 356 0 R/Filter/FlateDecode>>stream +xÚMŽA †ïþŠ÷Ø‚9]ck°]êP$t bMÛ#J[ЯOÛˆP¾÷ñùÞ;á`þpÌòp›+Y +’TpqöI^d´€“þ¦%úÚ<ÕaR™ã^ËV9L_‡(ÂóMøŽø€$Uö³ÆiN³ +M§Äk¸®vн¶úd4Ũá§ó±_¹Û`Üë¥8{iµ«ð%Èxž²@¦,3¶ð¾ƒÆÔÖâÛû]?dHKA¶äŽqNÍendstream +endobj +356 0 obj +199 +endobj +357 0 obj<</Type/Page/Parent 290 0 R/Contents 358 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 92 0 R>>endobj +358 0 obj<</Length 359 0 R/Filter/FlateDecode>>stream +xÚì[ÛÆ€OâxS+‰»’ãÝ>é‹‹Â{ÑÞ¢Àj/‰ßŠÖhŠ"pìM²…c;»6Œ +qòCo)•,éÙ»€ö´'ƒTZÛ¿‡ž´2?±ÛOl½Ö$N~ª-$ L%{ +=ñýh°'’¶½€£¬V‘üâ$Gµ5Büi{⎠ážE.<iª'÷5ž'¡!žôÊ#ž4Õk@JeOT½àIO +ë<i¬'Ö¸‚Êy¬ê?ñå±eÄyl£ók\Aź¸—õǪج‹{A{êâ6æ±Õá/¹'“ÎX<ꞈø*a;b¤«MçIà/‚¥iO +jë? égª‹EfêgC“óXÏøØEödžyRØ[Þo&sñdqßâIù÷€h2ƒ'*‹mì÷Åu
áE“<I›iöøh¬'ŒgÓ O‹'Až +ä
ƒÖĹŒ?Á“¥Ëcç2ŽO–».Æ<É{2jJ8/J<™ÅŒ…néù;"œ7 +¥žˆp~1xÂy蟨DOð¤ ÞéPï@—ów +žà‰?%î@X½ƒ'@Ü<âÇq–ÒúÙ 0?ÁÀÀÀh'F"‹'xRPã ”ybÌ4œx’žÁpÍr½f…Kœs5ôÖ{¢æ:À<)ò¤Âoyð¤åù‰ùýNsÆw±,©ö‚³=IwÐÉ֯Ư£M;=±þ×'QHE#%JÎc-kk{gÊESËúOlOÒã˜_ÐÙŒ~QÌ݇x²ž¨ ¤e«ä=ɺf³_Mv+xÒpOÆS)çÎw¬x¢·6ÒWS4i~~Òqç'b_&[â‰Ú
ž´¼.¶®ƒà:ÀilÐOœ&?Ä“æ{"Ò±=±³DQ®z'ßž”†!²“Vx’Ÿ'GT§Ç$Äo7°.N”NkWñ¤5ý'w>ÞMÚQïtîxž<icÿÉâ-Á< ò„CÔŠº˜ùO + Åu1´É®‡xuÆ!î +âNr‹=ñL6âz:÷œž+‹ùmðOVÏ“±"µyR¶ ,“'é4ŒÝô’Y‘üµ”3C¯žîoڛǮ%?LOÔ4Ñv QO§K~OìýÀ’Ôű'é®1ë¼s…T€|~’ß,“'V›à|º›;þnOL—`yê[ˆ®×¡\qÇšTUð¤Ä2Ùå÷Äw$w%—']U5áɲzbÕ;V$ºðqÖ;îõ`é<éš—Q2zMªÔÅ\õ¢Õž0ž
¦«‹Oððððð¨‹auÚ“µ5Ú‰;Ê<Á“‚ü$5Oð¤0%?Ú ?ê ÿÚ˜ÇÒž +ä +NZäzŠQ^/Bnª¶¿ê{ó]¿J>ÉbËRŠÇ>‚È2É€¥`^‡qe +V$¼ÿ—Í +endobj +359 0 obj +4684 +endobj +360 0 obj<</Type/Page/Parent 290 0 R/Contents 361 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 100 0 R>>endobj +361 0 obj<</Length 362 0 R/Filter/FlateDecode>>stream +xÚµ–Mo›@†ïþ£öâT5›/[)i¤¦R› öâ˳°.»ŽíúÛ;³q>L+G¶LÞ™y–yaókä‹f!}Ójô1_¦àyä0)„±ïÄdãÅ4Œà,ù9ºHF®ãb"ýxôsó Óµ3ÔVÌM"%ÜRÑ' Í +Î/ý¶
v¾o¢ +¹¥½{¯ï°&j'Þ{ÄŠ\'D¬pŽÄŠ<ÔbÍwZ‰ßüôhAäø„š ¢1j M®KQ¿™ï£ÉgÖÉüÀ6¹J,ËW ›aˆdþÌ™·Á@²™iñ +ó"ã{ßs‚6HäÅÖ÷»Ó3¹¾1½e2Á@&7°¦ß¿Ä4ï˜P=™†Ö‡W¼\X¯ãÅåJºMRpHet³Iµl m8Ó\Æó™`¥\ÁZ¤zÓðØRÞqÇ–š?/õ‡ú}|{´aÆïû™?åÞ6ÜŠlÅ5°:ƒ¼áHÁÊ*^Éf×™†‚)Xr^Ó™"( +±å¦›¦áµ†\”=ŒE/ß
ÇÅÖ¦dÁŪРsÙ·Íènîã:c\BÉíË +Ԭ‘1¤’d@Í YC ËÆꞯñ›.Ñ)tU¾µÒ7‹³#Ë^K%´õ·{Oð°ß÷z Kê|9àö6œ¶£§]ìq»µÇ¢èíJ”±ÿô§}º×T·(8¹©ºmx1ÞO)ð`pöüA×Gȵ|žWt4o ž³M©M6Pú1»ó>vyýé±–S£"Ì +endobj +362 0 obj +731 +endobj +363 0 obj<</Type/Page/Parent 290 0 R/Contents 364 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>>>endobj +364 0 obj<</Length 365 0 R/Filter/FlateDecode>>stream +xÚ’±NÃ0†w?Å?¦CBìFI:‚Ô + –Xº´‰C;Ħžž¸)„„‚T¼Ü}wß?ø™qÄCqdóÅ»ìlµ +endobj +365 0 obj +242 +endobj +366 0 obj<</Type/Page/Parent 290 0 R/Contents 367 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 107 0 R>>endobj +367 0 obj<</Length 368 0 R/Filter/FlateDecode>>stream +xÚì]ÍÇu/è4´¨‹ôm09„F(rI®)‚%w‡¶.AÌ&‡ ‘¶0½” ÃprØj„è9dºÚ×ØÑ1™ÌAð%¤½ŒœH€¼ùd]ê?èÔ{¯>»{¾vVÚ™îªÝíéïúõ¯ÞG½WÕ?~ç|{Sýœo_¼¿ýó;×z~¥}þ{g/·{?TÛ.}p¥Ý»yú£;7îßoÿàÖ{»·oÜùäGßíýÓ;ÝÞ;›gaͳ[í˨åêoÿVû‡ö<Ï^Ðç¹xáìy8Óéöýû}܇»¾Ù¾B;ª»xÿÂ,ß<}ýÎ?~ÿ“ÏîÁ.›í÷Ïãáívû_Š+þì}UèDç͉N‡÷êßÌûp‘‹çÏ~ +2Uåþ@¡¨@é÷Ò–8HY8þXNÖ• ýäÌ‹¤’!Lt6ž§mP½¯á©g}øUõ©ö©ªõƒS˜Ú®@›S<I™b΀
€/kõ3<3ö¾)‘é +> ‚29=XÕO2BÔò™ç(™ +–S›ð‹²ClIíÇj~¢4AK$†8
s¨&n;¤ÂÛUõéI’$©tA¸ =ó’ý¥ÿª"ȸw¥2dÈA +k¢ª‹²C +qFII|Ú +,&ð´,?àY‚‚µÀV9@%Ø! +C]yðvûN˜ÊÛγŠ¾Ácj*æ hx´ö—•é|`Ä}še¨’gž'¤yÆèºÙ"_†¨=8V2$A©àÚ€RåT„Vì(l5š!›¸œœÐ²}>ZØÓ$ˆaˆVÉŠ!O†(Ø«¢´$H +[a
4tˆØ§@{ñšéo'³¬ïÑ +{ݘ‘Ðé™F/C<ùiò|´?Òe8úõP}ÀŠáþÈüèíþ×ý¡úÚ
´€ÍN#ïøoyo¨k44÷¬£sgìî°å×^Üí·O‹ö°ã•Q§æ廉ÕÝxuºýV§#w6r7ì´ß=|ÑÉš]” +‚˜D’e‡‡¿ßx=&ªx±Šê2iƒ[Ÿ¬Z™T1aw±ñ³7¿W‚µ³ÔUÓõ+Ù„ªd e6
‡K=©OÔ§šv¦¡VG†LdõºG"2Ä0d–j'ÅgÈhÔ¼Æ1¡9ˆ±€¼Zˆ!õ/ÚÛ%†ì6°üåo{ø?‡ª|…€ y2f f¶è»Üýú”§Ïžm")0úÿ|LÙΛWî~ÌS´¶‰!Ï1ÇeHc!#lÛcˆèP“i( T¶±¾L£C^¡–É’f¢ªþ8dˆR½ÔÒL@”°`P†¼òdc¼â0Vc@²dÀÐ!`ˆ‘!R©æ†’&2¤ßÁ¾ˆâG%EêÈc0Њ2Ä0DQArÉsøeðÃ`µZP+ñ£fZ†Ò„†¤Ô§º@€VC€@ã¡€¨%^O@ë(fÀ}ͬ-# +U%Tc‡<
Ýdºˆ°y):I£‚–™³C0?¤¹2Ĩ™6c©&QËxq½îMõe +–ª×cÖP†€QZ&qZ¦ÉM¦kdˆÓ2cbH£{̺{™rç×"²æ +Õn±Ç¬Ñý!=#VmÙÆ#bˆh²ÚU`6bdˆ3Ý3«ežÄ³n e¨×š«ÞJ/6EÛŠ»È çJÒ>Áåøg)àåT6ñÒ í4-WÅm㺌›êy•¼‹XC„'C4C¸Ì9w·HÇézw\¾9}Å”$Óˆóà[ “Ê£§šy U¬åHU©]ä|rî¤w"©¯+ƒoÓëÇç$<÷öáÕ•äáY§"'¢¹\ +S¯`daÖe™`D˜ëOµ‹%eèí:)0Rý˜$Ž©xübÚ +£+JãD
€ÓMPšÇDnê bÌDµ +îIΧ‹ø,Ÿ–j¨¢/‚Oň•!áˆ*I©ösmƒqZÀâzŒ*B‡U·èr°C²´ÝD§ÒÆœDˉÅ%Tw…Ž‘ä0ëKç¸Ý¬ªðié’ÚÉÖ.0Þ35 #%ÓV!Þ>÷š5f=k˜¹"íË”ÌàJ×10ˆ+¬#[i]CݹŕgÕv½»î$ŸÖîã_׿…ÜzU%¯¹äËTe2£Cɘs.¹s«ú\º½m/ +ÙÛt*í¸È³åÞZß[–vò +ŸVûÑ’y€0ÿ™Øl@ +ŠX‰Ó$sgvÌøå_upÂIÓ1Èñ
ù2|¡Õ'eÅ̾â¸}™µ…*Ê—…x̾Ì<ßb +Pâf‚!é¦oZ†,— g¢²syå> ôÝ +L/×Ð-DâË‹8£8—w§/¾HBI +L¬’!‹Dÿ/£·¶v- ÞÀMsÀ*‚¾Ì‘zÌB@|{=°›»$‡!ù +Ò[FËp +E‡8[&2 ùvEÔ2FË ogñý2)’$›QË¢ðhE-ã‰o1ó’Aâ[Ì,CÒtP°Câ»2‘QË "¾Å¬À,¾+³ºÉ”µÌõ6¯T¾=D1h#›XªÞ¢´4™L4°(˜âfþ4ÚÇ.‘&M,•Ô1ä%j™ÔˆÛ¦C•¢¥šdF#7xñ-ÕÆ2$qÄÍüßT,¬I†¤ e’´±ÅJ+CöÓFGÀ—inNÞns’V1dý•Ì¿=så¿q·âÙe¨ã“É6üWå³u/OþË•û¸æ7nÅ^úþû³°<}ö…YôzÝ_=¨‡yôÎ}\ó·ñ +\&oÒ CÞꜮ“yo÷T eî^õ8µ²¤õ8)ôvh†ü_§½qøëɇ»»ß ´ŒZq + +Õ@vOe¬A;$Õ2iò6PE©íü‡±ÝZtkhâ3DÕõ§»»W…S»P{Å¥eZ©j-°PýG¡Z-#îî”rÊ Õ_A5U;QÄ`)SдÔb«‚!õ! +-3Ê öŸÕ É ÎýOµ˜Ð2DT2¤œc6ºØ!$3ý>UÝ…hÕî„â[ª£šXªŸ»BMæ½5—‘!»‹Ï¤Þî¿^ô +®ñW C³ÉÅ“!ûõ°CüþcQZ!Œ<™T<-“Õ×It'˜sBDšPUˆÌ\ +U±ù!uþSý§©@m©ŠNMf –¢*?¦\ +9fufHqE2… Η©qòG2EÒBŽYxQi™Ï"A~ˆÎ1kV–]¥iVŽYæçPM ˆí1kJZ¦í©– .ÇŒÅBE3äÌïÞÄB…|™'?‰…Ê#dHÖ÷ÌðE£FÌ”ªÛÞx4N}¹;|Ý,@ +Õo÷ôŸžþîi[:oN7©”ªÛ~·S(¯;*Å궣®-”ÿ +ä +LiâÍßî ÆõÀ2Yžá}&™uˆV™L„‚° (@åÅ}ujúr¸/Dì +pV$SÝAáÇV™žC ¥„›ª{½j‹®¯9æ»I~5}šÅV8ˆ§9™+R2ó ™õ23㥄÷TK59øå§z™ZšJ M[VgwÒHk1;õ2'¦mêú¢<»“²$CNž:Æz™-±ç„¡éßþrr3Ž:¥ŒÇiŒMþ +‰&endstream +endobj +368 0 obj +7978 +endobj +369 0 obj<</Type/Page/Parent 290 0 R/Contents 370 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 110 0 R>>endobj +370 0 obj<</Length 371 0 R/Filter/FlateDecode>>stream +xÚµTM›0¼ó+ž¶—¤R¼@XÈ^«n©©ÔnÐö’‹cLpvjœD{éoï{@6IW!ÛJÂxæͼñÇO/ +ÆèïÎ-¡³;6îot–ˆE‘ªÕª¼èìþà9£0fqf²Ü|T¼4ëå`9$걶„¥…atíìV8cAXɬÁáÿ¬¡ÃF ·µ2¾2;ÉÚR÷¯Ký"É'%÷W3ù¢×|šçVp¯²µtÀu¹•è‚—%T²2ö繃‚×°’RÓ„hX„¸bkÔrUöxÜ•A¡2Ùëq†€ÖQñ;ÈI¨çÜZ×™Ù_.
Ï–ƒ&n·ð>ïq1Gtë¢ÞH¡r…ÝÎÒ/ó¦EPÚ™Ki^¤lPþT@ó +Cãemh8®p +endobj +371 0 obj +558 +endobj +372 0 obj<</Type/Page/Parent 290 0 R/Contents 373 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F1 4 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>/Annots 124 0 R>>endobj +373 0 obj<</Length 374 0 R/Filter/FlateDecode>>stream +xÚµ—ÝoÛ6ÀßýWºwUê[zØÃ>ê®hl‹°½‰Š¸Ñ’FQu<ýÛ{'Jrf ™Øql鬻ãÇ;òü×ʆ/üˆþóÝê»lõv›‚: d%>‹â²b+Þuð£Pí¯Rì_g¬Þe+æÐsæ$1Þ{øÖÊÙ‹ïx£ßs\òó½õ#…æ:¯äèí–Aj‘aãt_¬·ê÷÷ºé[Ra°qs +¸[seª¦¨Ààľ½Î@ÝÈÇš8w¯OãÆŽQ»è¡W"gï%¨7í΋b8¦f/}¸ôñË{\4ŒŸ¦èn‰‹†VPpK9yb àd\½€1ËñtŽ6l¶™Ð61Vɾ%hIä„„Ú ,CóÑ"¤A>_Ž-öÙâƒ`……lq€º8H!µÈM£çg‹nÈ`¬°-rí¾Sb‰×|'ÎDNŠh¡Ya!Z;ÃÖªdýçù±|(‚0ÀA¬°Ël¨†çÇòØP +x=ìu¿·×ªº‚¼©±ÏÉ+®ákß +endobj +374 0 obj +943 +endobj +375 0 obj<</Type/Page/Parent 290 0 R/Contents 376 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R>>>>/Annots 126 0 R>>endobj +376 0 obj<</Length 377 0 R/Filter/FlateDecode>>stream +xÚV[oÚ0~çWœG:µ¡”K߶©lÒдµéxAšLâ€Wc§¶Ý~ýα¹¥ÐÛŠ’ø\¾ó[k14ðC§ —mHgµ÷Iím¿qIŽ'ín+êB’ÕS¬ƒtʼɅäŠÍø¨>:p–üDµÖZí¢ÙŽZ¤–L……wSá®4Ê‚›rHKc¸r°2¹6þÀñ'Bùûq™çÜDÁxo×ø\‹¤P£ú'.‹~©R§FgGÁaÖŠ Âa2)Ç,}€-8¡Ñ»†ÒrXL¹Âsr¨˜k)õ‚g€X™‡No¥f¾Õç‚Çãø2j’cÂ÷]ðÅõ5‰qUŒÄ¤›2‡$=–Âp‚• +Å9-˜›F;
O¹˜ó@o^JI¶n…é€_ÁcÉ·ÀT³Òºe¢ÁZÇCK™‚1â(¸âD1£ˆ·D°ü#qù¾Ij¨åE—˜.·¡Ù‹zpÕ¾Š0ƒN;Š—î¨ôøØ&´ã_£¡jÄL`ðçõ]QTåk¹5½°Ù„;J¬-‹BÃáX–!×–Û—‹L ÿ!g•8²ÈH3¤Ä<¹@æVÙ¼¿¼îÖŠßÿÒcØY7o5Óº¿ +ñÄ¥=Ð[$œj©Í¨Þ—?>Ф!òÊZm‰š*Ð ¡X3°ÜÐÏY)]Àé…‚·ííŸ!{T‡•kåFõÒg3ß )¼ßÈýŸpÈÖiÑxÃÁ„B í+Á]PGC¶NÆk¼Ìvw9á$ß’'ì•L§åŒn¼©sj·/÷ƒßÆn¥Ãé!‚u€Wû_í°\•ÅöÝ‘ –^œ·Ð>ljpmö$N3º*)s8Z +mÍòsà‚âı‡€
ñ³ƒ^1?ì‘œ±~ +Ð~$<s¿L¬/‚}$c0^÷èy2g²|Fä|‡¦ÊiPøëŠ]!]
¿À—uF¨ FÏnæ«—4ÙRØ÷6Ïðîñƒ*Wtt—€ãnŒ¯Ý» +Š7w_aÖÒ÷È¡?H>“ÎE½è4ž‰+°ú† V‡¾Ëüa³³Ü¶ßj +endobj +377 0 obj +830 +endobj +378 0 obj<</Type/Page/Parent 290 0 R/Contents 379 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +379 0 obj<</Length 380 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨J# ‰¡‘ž‰X 9'±¸XÁ#5§ ,3µ$éÂÈ +endobj +380 0 obj +113 +endobj +381 0 obj<</Type/Page/Parent 290 0 R/Contents 382 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F5 7 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>>>endobj +382 0 obj<</Length 383 0 R/Filter/FlateDecode>>stream +xÚ½WMS9½ó+º¸,TðŒ!70IÃnp²Ù*W¹äQGk4‘4ØίOK»Àá`c*ÅÅhzº_·^¿îù±Ó„CúkB§G';ý÷×gÐ<ƒ~FON:í¤}¾÷%2‹p§ÚýþÿѪœF»F»ãº9Sc´ <¶’Ãh—B³éZ§äªÑ:IŽ½é uÒhЮ
özhÆÈáZHìæZ[4À‡(ËKÁ¤Ö1ªœÐÊ>wO šGìßÇß7ÚtÑ0 ©.J +e`ÊŒjla°—jEý™ÑdR3NSJn°Ÿlò¾DE ÅÌ +Í‘âLµ™0£+J/ÓzߺïÞA¤oV=’XØÁþF!¯ÅŒ +hS£¥1³t“¼ÂK<<\~ü²bµtîÓaVýå€qî+7ì
öÃÕÍÃ/e]²a.w8]Å{w+f«F¥¶Âóc[ƒVüÄu,§ëÍ^4ò…X1œ¿`º\sëÙF4tt‡õ‰ôûS¡¸ž&ÛÖP +5y)zÊ<eÒI
@zja®+ÉVe©jˆpÉÔHœ9ÛD»œúHê”…ÎܤÙKµÔfÍ:qÌX%©Qé=/nAO— ®@éŸ_Ü^BiÃkuš +îr`.êÚ7|qùßo—äS{“`¹6â'UtI1V*÷zoŽ‘€§Ï8ŠZ +ehñZ/|øGð1nˆãþá}‹è6ÃÚå¹Ääî1‘¬n…¸ð®l†~û&¨×›ÉaÒ\sI|&;B¥²âžs› o€:•‰qeÐo@¢tkCzºqªã¤µ)*ï¡.íï½J8A¬”AƃRr’žÔ‘ãV‚0ÌœˆL×QÔ’G|ÆÅØr”af¨Y‰…6ó"Ú¹uXDâ)ºj»œÁáQÔe©õ$’¾'h'µ:sŒfoe9 +nîî{W^:¶ŠÆ
›.°4Å’ü3»,õ:·K_ lVǤiÏOkùË ™ÒxŠºŽv…¥ÁSP¯ éhj1c¾_ôBjñÛ§ötº¡æÉiÒ~ñ»ò¸sLe8ôÏZgþિóÏÎ/€¯:uendstream +endobj +383 0 obj +1161 +endobj +384 0 obj<</Type/Page/Parent 290 0 R/Contents 385 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 6 0 R/F8 8 0 R/F9 9 0 R/Fc 10 0 R>>>>>>endobj +385 0 obj<</Length 386 0 R/Filter/FlateDecode>>stream +xÚ½XmS9þίPùR˜’”$”÷©…ÀdJ[®ä®÷!3g$>{Ïör¿þ$ïnš—%e™ö’¬$K½8ÿì´à~ZÐ9æßdºó¾¿óúòZoš'Ðѳ㷧З{çaÆèA¸TÏ'Öztpßjí÷ÿ&Z-ÖhŸ4ÛÐh7XmÐ>~¹ÀQ!°÷ÉÎ uö^I”IfÂáúê溹jë™{ÄÐCï•GõsaÔ0ÌB°æ +çフà„ΰžKýÂD/±†Ì +ïÁÐÚ +IØчFäÊùE„‘ñÄÞ—Þ_Ð3H‚ºG¸@l +ƒ=‘Û0 õ–Ò²pÀe¦Ô›ƒ}¸ÍÒÔº_}úü±{ +‡¥‚CÔƒ½Áþš!˜b˜XÍbNrh„‡¨’ƒ4SrŒ¡tó;'9Å:'ÛyÙ©ËËw’ ip¶FŒÙ¤YX#÷ExjùÒƒŸPЇâÉ8£ÔxK˜J
™1bŠØiª1(FQÁôÎT˜ÄlõÅð +{c—ÞÒd”I¬sÈÇ
ÌSžè牴[Jâìì¶÷é꺻Ao‘LUscF½l›Íó/Ýwýîvæÿ8¤’æe +w}zù°š¦fjS9Mnj¤åf±µƒ‘ûþìÞÐúæK#l +Ò]‰íÅnÝôækÁZ(q_QÿVÚÁº,{™XmÝS…GÖ„JÙ +LYþGŠŠ÷EÛ~ZQ¬ÛˆkÞ³J¢¤ ±´þÒàsÅ,̼X÷†s8™¿Ñ"¤uÌiÅþÅzßò¶ò-j>ìFg*vª…,UFËx‹1ûY;Ö{ÚÙ¶ïX“Í©±…iË &©@#;ßaH¼Üg¢ú*SᨅR[9;]0õþ¿p}~i¡ +endobj +386 0 obj +1344 +endobj +387 0 obj<</Type/Page/Parent 290 0 R/Contents 388 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 6 0 R/F8 8 0 R/Fc 10 0 R>>>>>>endobj +388 0 obj<</Length 389 0 R/Filter/FlateDecode>>stream +xÚ…Aoƒ †ïþŠ7=u©(SÎmêe;l)É.»AaAèÔÖôßœ;/„äËÇÃûðñPdaQT9ŠíEr¨[P +Ñ!ç$GÉárÿ™—žÄW +£õa2ãP‡7œ´÷“q§„EšUñËV² ±qÉ{òQVhcendstream +endobj +389 0 obj +248 +endobj +390 0 obj<</Type/Page/Parent 290 0 R/Contents 391 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +391 0 obj<</Length 392 0 R/Filter/FlateDecode>>stream +xÚ-Š±‚0E÷÷wÔÊkQ™%tÁAÃKœ¨QøýR5÷Üå伈‘.c˜]äö¤ƒÐÆæ`†´àœc¯SH³*ë.¾éÜŒzyFØ£Tk¹Sò“it”&Û*¯(úëй ~€õWô!LnÄ›UËRèL%x#oendstream +endobj +392 0 obj +124 +endobj +393 0 obj<</Type/Page/Parent 290 0 R/Contents 394 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 6 0 R/F5 7 0 R/F8 8 0 R/F9 9 0 R>>>>/Annots 158 0 R>>endobj +394 0 obj<</Length 395 0 R/Filter/FlateDecode>>stream +xÚÕšMo7†ïþ{LÝð›»ÇÆÛ EÐÆJÓC€Bµ×¶Z}¸’œ +uQ#+'Ò(ù
ÀS;FÙÍ`¾v"j\õ +·ä¢Nã˜NHY›‘: 2µÎpƒôS·¼Ð‰þéUeíá‹F 7P?,æËÍmؽ§Û/êÂ’ámÐDÈD°ŽÊ„`$Žß‚L”æÌLFZëÁHd‚YÒÃQBç”ä…"’FH8\êZæ øòÕKe7¤=Ä!õ‰M‘q ++Ñ/?eLW’²ŽIŽr•k¾É)ÍYË ³A5Èè%G¹„+9‘t!#9É9Ê’9Ü<e‚(¿\íÔlBð‡)㳚òâ +F03>\àp·u‚¿Öúþ¶·¶æÓ +o +ÑR¶}2’h©f¼ÔG§Œ?`Ë?ß/>Ï·×á +SÕ“Ú>ya“”RõbOF/©Ç‹}$¡¾Rüº¿¿píØ4ëK”ÔÞ¯zµF/!NP{8ç>^) +~Ñ·¯ýEfS +™P…p±&Q{ÖäjÏÚÔ$æ’9 +þ¶¿`ø}Ñ}šâjf°c
½4 ïÉ8Ò±‹oNÞvËn¾8&%—xÉ pƒöf³ïBÿ/|€§{Eîhî>ý©œŒcm¿0-ÉÑùÝ|}Û
”_r‡VëzŒ +7h‹«‘äÙ¸d$øAú(êШs3›‚bü5½£¢¸h)¤Ð‡7T£¢E&eÁ
Z9ê +ódjTLš¢wmV%2 +/ØF&
, +lÊ‚´rÒ +«È_ +ÉNHHÖ”Dnb•"™rÈ/Ù©éŠDJWJÄ +endobj +395 0 obj +1747 +endobj +396 0 obj<</Type/Page/Parent 290 0 R/Contents 397 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 8 0 R>>>>>>endobj +397 0 obj<</Length 398 0 R/Filter/FlateDecode>>stream +xÚ+ä2T0 +áÒw³P04TIS0´0Ô3T072PIÑp
PÏLIO-Qâ´ü"7ŸoÍ,.]ˆB]¨ÊÌL kW +endobj +398 0 obj +89 +endobj +399 0 obj<</Count 7/First 400 0 R/Last 423 0 R>>endobj +400 0 obj<</Parent 399 0 R/Title(Table of Contents)/Dest[393 0 R/XYZ null 756 null]/Next 401 0 R>>endobj +401 0 obj<</Parent 399 0 R/Count -2/First 402 0 R/Last 403 0 R/Title(Introduction)/Dest[297 0 R/XYZ null 743 null]/Prev 400 0 R/Next 404 0 R>>endobj +402 0 obj<</Parent 401 0 R/Title(Compiling the Widget Set under UNIX)/Dest[297 0 R/XYZ null 634 null]/Next 403 0 R>>endobj +403 0 obj<</Parent 401 0 R/Title(Compiling the Widget Set under Windows)/Dest[297 0 R/XYZ null 389 null]/Prev 402 0 R>>endobj +404 0 obj<</Parent 399 0 R/Count -2/First 405 0 R/Last 406 0 R/Title(The File Chooser)/Dest[303 0 R/XYZ null 743 null]/Prev 401 0 R/Next 407 0 R>>endobj +405 0 obj<</Parent 404 0 R/Title(Implementation)/Dest[303 0 R/XYZ null 660 null]/Next 406 0 R>>endobj +406 0 obj<</Parent 404 0 R/Title(Using the FileChooser Widget)/Dest[303 0 R/XYZ null 397 null]/Prev 405 0 R>>endobj +407 0 obj<</Parent 399 0 R/Count -2/First 408 0 R/Last 409 0 R/Title(The Help Dialog)/Dest[309 0 R/XYZ null 743 null]/Prev 404 0 R/Next 410 0 R>>endobj +408 0 obj<</Parent 407 0 R/Title(Implementation)/Dest[309 0 R/XYZ null 647 null]/Next 409 0 R>>endobj +409 0 obj<</Parent 407 0 R/Title(Using the HelpDialog Widget)/Dest[309 0 R/XYZ null 569 null]/Prev 408 0 R>>endobj +410 0 obj<</Parent 399 0 R/Count -2/First 411 0 R/Last 412 0 R/Title(The Help Application \(flsurf\))/Dest[315 0 R/XYZ null 743 null]/Prev 407 0 R/Next 413 0 R>>endobj +411 0 obj<</Parent 410 0 R/Title(Implementation)/Dest[315 0 R/XYZ null 673 null]/Next 412 0 R>>endobj +412 0 obj<</Parent 410 0 R/Title(Using the HelpApp Widget)/Dest[315 0 R/XYZ null 556 null]/Prev 411 0 R>>endobj +413 0 obj<</Parent 399 0 R/Count -9/First 414 0 R/Last 422 0 R/Title(Widgets)/Dest[321 0 R/XYZ null 743 null]/Prev 410 0 R/Next 423 0 R>>endobj +414 0 obj<</Parent 413 0 R/Title(class CheckButton)/Dest[324 0 R/XYZ null 736 null]/Next 415 0 R>>endobj +415 0 obj<</Parent 413 0 R/Title(class FileBrowser)/Dest[327 0 R/XYZ null 736 null]/Prev 414 0 R/Next 416 0 R>>endobj +416 0 obj<</Parent 413 0 R/Title(class FileChooser)/Dest[330 0 R/XYZ null 736 null]/Prev 415 0 R/Next 417 0 R>>endobj +417 0 obj<</Parent 413 0 R/Title(class FileIcon)/Dest[339 0 R/XYZ null 736 null]/Prev 416 0 R/Next 418 0 R>>endobj +418 0 obj<</Parent 413 0 R/Title(class FileInput)/Dest[348 0 R/XYZ null 736 null]/Prev 417 0 R/Next 419 0 R>>endobj +419 0 obj<</Parent 413 0 R/Title(class Fl_Wizard)/Dest[351 0 R/XYZ null 736 null]/Prev 418 0 R/Next 420 0 R>>endobj +420 0 obj<</Parent 413 0 R/Title(class HelpApp)/Dest[357 0 R/XYZ null 736 null]/Prev 419 0 R/Next 421 0 R>>endobj +421 0 obj<</Parent 413 0 R/Title(class HelpDialog)/Dest[366 0 R/XYZ null 736 null]/Prev 420 0 R/Next 422 0 R>>endobj +422 0 obj<</Parent 413 0 R/Title(class HelpView)/Dest[372 0 R/XYZ null 736 null]/Prev 421 0 R>>endobj +423 0 obj<</Parent 399 0 R/Count -8/First 424 0 R/Last 431 0 R/Title(Release Notes)/Dest[381 0 R/XYZ null 743 null]/Prev 413 0 R>>endobj +424 0 obj<</Parent 423 0 R/Title(Changes in v2.0)/Dest[381 0 R/XYZ null 694 null]/Next 425 0 R>>endobj +425 0 obj<</Parent 423 0 R/Title(Changes in HelpView v1.0.1)/Dest[381 0 R/XYZ null 365 null]/Prev 424 0 R/Next 426 0 R>>endobj +426 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.4.2)/Dest[381 0 R/XYZ null 301 null]/Prev 425 0 R/Next 427 0 R>>endobj +427 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.4.1)/Dest[381 0 R/XYZ null 184 null]/Prev 426 0 R/Next 428 0 R>>endobj +428 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.4)/Dest[384 0 R/XYZ null 736 null]/Prev 427 0 R/Next 429 0 R>>endobj +429 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.3)/Dest[384 0 R/XYZ null 637 null]/Prev 428 0 R/Next 430 0 R>>endobj +430 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.2)/Dest[384 0 R/XYZ null 520 null]/Prev 429 0 R/Next 431 0 R>>endobj +431 0 obj<</Parent 423 0 R/Title(Changes in FileChooser v1.1)/Dest[384 0 R/XYZ null 178 null]/Prev 430 0 R>>endobj +432 0 obj<</Type/Catalog/Pages 290 0 R/Names 159 0 R/PageLayout/SinglePage/Outlines 399 0 R/OpenAction[297 0 R/XYZ null null null]/PageMode/UseOutlines/PageLabels<</Nums[0<</P(title)>>1<</P(eltit)>>2<</S/r>>4<</S/D>>]>>>>endobj +xref +0 433 +0000000000 65535 f +0000000015 00000 n +0000000216 00000 n +0000001537 00000 n +0000001611 00000 n +0000001690 00000 n +0000001776 00000 n +0000001854 00000 n +0000001931 00000 n +0000002007 00000 n +0000002088 00000 n +0000002147 00000 n +0000002214 00000 n +0000002299 00000 n +0000002323 00000 n +0000002373 00000 n +0000002458 00000 n +0000002482 00000 n +0000002587 00000 n +0000002692 00000 n +0000002796 00000 n +0000002901 00000 n +0000003006 00000 n +0000003110 00000 n +0000003215 00000 n +0000003320 00000 n +0000003425 00000 n +0000003505 00000 n +0000003609 00000 n +0000003713 00000 n +0000003744 00000 n +0000003849 00000 n +0000003954 00000 n +0000004059 00000 n +0000004164 00000 n +0000004269 00000 n +0000004321 00000 n +0000004425 00000 n +0000004529 00000 n +0000004632 00000 n +0000004735 00000 n +0000004839 00000 n +0000004942 00000 n +0000005045 00000 n +0000005148 00000 n +0000005249 00000 n +0000005351 00000 n +0000005452 00000 n +0000005546 00000 n +0000005651 00000 n +0000005756 00000 n +0000005861 00000 n +0000005966 00000 n +0000006071 00000 n +0000006176 00000 n +0000006235 00000 n +0000006340 00000 n +0000006445 00000 n +0000006550 00000 n +0000006655 00000 n +0000006760 00000 n +0000006865 00000 n +0000006970 00000 n +0000007075 00000 n +0000007180 00000 n +0000007285 00000 n +0000007390 00000 n +0000007495 00000 n +0000007600 00000 n +0000007705 00000 n +0000007810 00000 n +0000007915 00000 n +0000008020 00000 n +0000008125 00000 n +0000008230 00000 n +0000008380 00000 n +0000008484 00000 n +0000008588 00000 n +0000008619 00000 n +0000008724 00000 n +0000008829 00000 n +0000008934 00000 n +0000009039 00000 n +0000009144 00000 n +0000009196 00000 n +0000009301 00000 n +0000009349 00000 n +0000009434 00000 n +0000009539 00000 n +0000009644 00000 n +0000009748 00000 n +0000009851 00000 n +0000009954 00000 n +0000010020 00000 n +0000010123 00000 n +0000010227 00000 n +0000010331 00000 n +0000010435 00000 n +0000010538 00000 n +0000010641 00000 n +0000010744 00000 n +0000010811 00000 n +0000010916 00000 n +0000010971 00000 n +0000011057 00000 n +0000011160 00000 n +0000011262 00000 n +0000011364 00000 n +0000011422 00000 n +0000011528 00000 n +0000011634 00000 n +0000011668 00000 n +0000011773 00000 n +0000011878 00000 n +0000011983 00000 n +0000012088 00000 n +0000012192 00000 n +0000012296 00000 n +0000012400 00000 n +0000012505 00000 n +0000012610 00000 n +0000012715 00000 n +0000012819 00000 n +0000012924 00000 n +0000013028 00000 n +0000013150 00000 n +0000013256 00000 n +0000013282 00000 n +0000013387 00000 n +0000013493 00000 n +0000013599 00000 n +0000013704 00000 n +0000013810 00000 n +0000013916 00000 n +0000014021 00000 n +0000014127 00000 n +0000014233 00000 n +0000014338 00000 n +0000014444 00000 n +0000014550 00000 n +0000014655 00000 n +0000014761 00000 n +0000014867 00000 n +0000014973 00000 n +0000015079 00000 n +0000015185 00000 n +0000015291 00000 n +0000015397 00000 n +0000015503 00000 n +0000015609 00000 n +0000015714 00000 n +0000015820 00000 n +0000015926 00000 n +0000016032 00000 n +0000016138 00000 n +0000016244 00000 n +0000016350 00000 n +0000016456 00000 n +0000016562 00000 n +0000016828 00000 n +0000016862 00000 n +0000016896 00000 n +0000019734 00000 n +0000019783 00000 n +0000019832 00000 n +0000019881 00000 n +0000019930 00000 n +0000019979 00000 n +0000020028 00000 n +0000020077 00000 n +0000020126 00000 n +0000020175 00000 n +0000020224 00000 n +0000020273 00000 n +0000020322 00000 n +0000020371 00000 n +0000020420 00000 n +0000020469 00000 n +0000020518 00000 n +0000020567 00000 n +0000020616 00000 n +0000020665 00000 n +0000020714 00000 n +0000020763 00000 n +0000020812 00000 n +0000020861 00000 n +0000020910 00000 n +0000020959 00000 n +0000021008 00000 n +0000021057 00000 n +0000021106 00000 n +0000021155 00000 n +0000021204 00000 n +0000021253 00000 n +0000021302 00000 n +0000021351 00000 n +0000021400 00000 n +0000021449 00000 n +0000021498 00000 n +0000021547 00000 n +0000021596 00000 n +0000021645 00000 n +0000021694 00000 n +0000021743 00000 n +0000021792 00000 n +0000021841 00000 n +0000021890 00000 n +0000021939 00000 n +0000021988 00000 n +0000022037 00000 n +0000022085 00000 n +0000022134 00000 n +0000022183 00000 n +0000022232 00000 n +0000022281 00000 n +0000022330 00000 n +0000022379 00000 n +0000022428 00000 n +0000022477 00000 n +0000022526 00000 n +0000022575 00000 n +0000022624 00000 n +0000022673 00000 n +0000022722 00000 n +0000022771 00000 n +0000022820 00000 n +0000022869 00000 n +0000022918 00000 n +0000022967 00000 n +0000023016 00000 n +0000023064 00000 n +0000023113 00000 n +0000023162 00000 n +0000023211 00000 n +0000023260 00000 n +0000023309 00000 n +0000023358 00000 n +0000023407 00000 n +0000023456 00000 n +0000023505 00000 n +0000023554 00000 n +0000023603 00000 n +0000023652 00000 n +0000023701 00000 n +0000023750 00000 n +0000023799 00000 n +0000023848 00000 n +0000023897 00000 n +0000023946 00000 n +0000023995 00000 n +0000024044 00000 n +0000024093 00000 n +0000024141 00000 n +0000024190 00000 n +0000024239 00000 n +0000024288 00000 n +0000024337 00000 n +0000024386 00000 n +0000024435 00000 n +0000024484 00000 n +0000024533 00000 n +0000024582 00000 n +0000024631 00000 n +0000024680 00000 n +0000024729 00000 n +0000024778 00000 n +0000024827 00000 n +0000024876 00000 n +0000024925 00000 n +0000024974 00000 n +0000025023 00000 n +0000025072 00000 n +0000025121 00000 n +0000025170 00000 n +0000025219 00000 n +0000025268 00000 n +0000025317 00000 n +0000025366 00000 n +0000025415 00000 n +0000025464 00000 n +0000025513 00000 n +0000025562 00000 n +0000025611 00000 n +0000025660 00000 n +0000025709 00000 n +0000025758 00000 n +0000025807 00000 n +0000025856 00000 n +0000025905 00000 n +0000025953 00000 n +0000026002 00000 n +0000026359 00000 n +0000026490 00000 n +0000026719 00000 n +0000026740 00000 n +0000026835 00000 n +0000026937 00000 n +0000026957 00000 n +0000027129 00000 n +0000028048 00000 n +0000028069 00000 n +0000028182 00000 n +0000028363 00000 n +0000028384 00000 n +0000028534 00000 n +0000029674 00000 n +0000029696 00000 n +0000029809 00000 n +0000029994 00000 n +0000030015 00000 n +0000030155 00000 n +0000030789 00000 n +0000030810 00000 n +0000030923 00000 n +0000031107 00000 n +0000031128 00000 n +0000031282 00000 n +0000032127 00000 n +0000032148 00000 n +0000032261 00000 n +0000032461 00000 n +0000032482 00000 n +0000032646 00000 n +0000033574 00000 n +0000033595 00000 n +0000033768 00000 n +0000034434 00000 n +0000034455 00000 n +0000034628 00000 n +0000035534 00000 n +0000035555 00000 n +0000035749 00000 n +0000043124 00000 n +0000043146 00000 n +0000043310 00000 n +0000044337 00000 n +0000044358 00000 n +0000044498 00000 n +0000045093 00000 n +0000045114 00000 n +0000045287 00000 n +0000046244 00000 n +0000046265 00000 n +0000046405 00000 n +0000047254 00000 n +0000047275 00000 n +0000047425 00000 n +0000047998 00000 n +0000048019 00000 n +0000048192 00000 n +0000048946 00000 n +0000048967 00000 n +0000049140 00000 n +0000050108 00000 n +0000050129 00000 n +0000050260 00000 n +0000050530 00000 n +0000050551 00000 n +0000050745 00000 n +0000055500 00000 n +0000055522 00000 n +0000055687 00000 n +0000056489 00000 n +0000056510 00000 n +0000056650 00000 n +0000056963 00000 n +0000056984 00000 n +0000057179 00000 n +0000065228 00000 n +0000065250 00000 n +0000065415 00000 n +0000066044 00000 n +0000066065 00000 n +0000066239 00000 n +0000067253 00000 n +0000067274 00000 n +0000067429 00000 n +0000068330 00000 n +0000068351 00000 n +0000068464 00000 n +0000068648 00000 n +0000068669 00000 n +0000068828 00000 n +0000070060 00000 n +0000070082 00000 n +0000070232 00000 n +0000071647 00000 n +0000071669 00000 n +0000071801 00000 n +0000072120 00000 n +0000072141 00000 n +0000072254 00000 n +0000072449 00000 n +0000072470 00000 n +0000072625 00000 n +0000074443 00000 n +0000074465 00000 n +0000074578 00000 n +0000074738 00000 n +0000074758 00000 n +0000074813 00000 n +0000074918 00000 n +0000075067 00000 n +0000075190 00000 n +0000075316 00000 n +0000075469 00000 n +0000075571 00000 n +0000075687 00000 n +0000075839 00000 n +0000075941 00000 n +0000076056 00000 n +0000076224 00000 n +0000076326 00000 n +0000076438 00000 n +0000076582 00000 n +0000076687 00000 n +0000076805 00000 n +0000076923 00000 n +0000077038 00000 n +0000077154 00000 n +0000077270 00000 n +0000077384 00000 n +0000077501 00000 n +0000077603 00000 n +0000077740 00000 n +0000077843 00000 n +0000077970 00000 n +0000078100 00000 n +0000078230 00000 n +0000078358 00000 n +0000078486 00000 n +0000078614 00000 n +0000078729 00000 n +trailer +<</Size 433/Root 432 0 R/Info 1 0 R>> +startxref +78957 +%%EOF diff --git a/SrcUnix/espws-2.0/file.html b/SrcUnix/espws-2.0/file.html new file mode 100644 index 0000000..4cc3c08 --- /dev/null +++ b/SrcUnix/espws-2.0/file.html @@ -0,0 +1,76 @@ +<HTML> +<HEAD> + <TITLE>The File Chooser - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>The File Chooser</H1> + +<P>The <CODE>FileChooser</CODE> widget provides a standard file selection +dialog for your applications. It supports three different selection modes - +single file selection, multiple file selection, and new file selection (for +use in "save as" situations). + +<H2>Implementation</H2> + +<P>The <CODE>FileChooser</CODE> widget is based upon four classes: + +<UL> + + <LI><CODE>FileBrowser</CODE> - this is a subclass of + <CODE>Fl_Browser</CODE> that lists files in a specified directory or + all drives/mount points on a system. + + <LI><CODE>FileChooser</CODE> - this is the high-level class that + provides the dialog window and controls. + + <LI><CODE>FileIcon</CODE> - this class provides icon images for + the <CODE>FileBrowser</CODE> widget and associates + filetypes/extensions with those icon images. The current code + understands SGI ".fti" files used under IRIX and ".xpm" files + used by CDE. + + <LI><CODE>FileInput</CODE> - this is a subclass of + <CODE>Fl_Input</CODE> that remaps the Tab key. The new mapping + allows a user to move the cursor to the end of the current + selection using the Tab key (i.e. to accept filename + completion), but if there is no selection the Tab key performs + navigation instead. + +</UL> + +<P>The <CODE>FileIcon</CODE> class allows you to add icons for +individual file types. Normally you'll just use the +<CODE>FileIcon::load_system_icons()</CODE> method to load icons +specific to your system; if the system icons can't be loaded +then generic file and folder icons are used instead. Icons are +only shown if you have loaded them. + +<H2>Using the FileChooser Widget</H2> + +<P>To use the <CODE>FileChooser</CODE> widget in your program, do: + +<UL><PRE> +#include "FileChooser.h" + +... + +{ + FileIcon::load_system_icons(); // Optional... + + FileChooser fc("pathname", "*.pattern", type, "title"); + + fc.show(); + while (fc.visible()) + Fl::wait(); + + fc.count() = number of selected files + fc.value() = value of first (or only) selected file + fc.value(n) = value of selection "n" +} +</PRE></UL> + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/flsurf.cxx b/SrcUnix/espws-2.0/flsurf.cxx new file mode 100644 index 0000000..de7c9ac --- /dev/null +++ b/SrcUnix/espws-2.0/flsurf.cxx @@ -0,0 +1,67 @@ +// +// "$Id: flsurf.cxx,v 1.2 2000/01/24 01:27:21 mike Exp $" +// +// flsurf program. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outblockd in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// main() - Display the help GUI... +// + +// +// Include necessary headers... +// + +#include "HelpApp.h" +#include <FL/x.H> + + +// +// 'main()' - Display the help GUI... +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + HelpApp *app; // Help application + + + fl_open_display(); + + app = new HelpApp; + + if (argc >= 2) + app->load(argv[1]); + + app->show(); + + Fl::run(); + + delete app; + + return (0); +} + + +// +// End of "$Id: flsurf.cxx,v 1.2 2000/01/24 01:27:21 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/flsurf.gif b/SrcUnix/espws-2.0/flsurf.gif Binary files differnew file mode 100644 index 0000000..ab586e9 --- /dev/null +++ b/SrcUnix/espws-2.0/flsurf.gif diff --git a/SrcUnix/espws-2.0/flsurf.html b/SrcUnix/espws-2.0/flsurf.html new file mode 100644 index 0000000..4796df5 --- /dev/null +++ b/SrcUnix/espws-2.0/flsurf.html @@ -0,0 +1,66 @@ +<HTML> +<HEAD> + <TITLE>The Help Application (flsurf) - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORD="20,19,74,36" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORD="96,19,240,36" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORD="262,19,356,36" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORD="378,19,416,36" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORD="438,19,487,36" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>The Help Application (flsurf)</H1> + +<P>The <CODE>HelpApp</CODE> widget provides a simple web browser application, +complete with bookmarks, proxy support, and so forth. The <CODE>flsurf</CODE> +application included with the distribution demonstrates how to use it. + +<H2>Implementation</H2> + +<P>The <CODE>HelpApp</CODE> widget is composed of several windows and control +widgets. The HTML viewing portion is handled by the <CODE>HelpView</CODE> +widget, while file selection is handled by the <CODE>FileChooser</CODE> +widget. + +<P>HTTP access to files is handled by the <A HREF="http://www.cups.org">CUPS</A> +HTTP functions. Currently only a single file is cached, so any navigation +results in a reload. + +<H2>Using the HelpApp Widget</H2> + +<P>The source for <CODE>flsurf</CODE> is shown below: + +<UL><PRE> +#include "HelpApp.h" +#include <FL/x.H> + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + HelpApp *app; // Help application + + + fl_open_display(); + + app = new HelpApp; + + if (argc >= 2) + app->load(argv[1]); + + app->show(); + + Fl::run(); + + delete app; + + return (0); +} +</PRE></UL> + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/fltk.css b/SrcUnix/espws-2.0/fltk.css new file mode 100644 index 0000000..b8ee428 --- /dev/null +++ b/SrcUnix/espws-2.0/fltk.css @@ -0,0 +1,6 @@ +H1 { font-family: sans-serif } +H2 { font-family: sans-serif } +H3 { font-family: sans-serif } +H4 { font-family: sans-serif } +H5 { font-family: sans-serif } +H6 { font-family: sans-serif } diff --git a/SrcUnix/espws-2.0/help.html b/SrcUnix/espws-2.0/help.html new file mode 100644 index 0000000..1c844ed --- /dev/null +++ b/SrcUnix/espws-2.0/help.html @@ -0,0 +1,44 @@ +<HTML> +<HEAD> + <TITLE>The Help Dialog - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>The Help Dialog</H1> + +<P>The <CODE>HelpDialog</CODE> widget displays HTML files and allows the +user to click on links to do navigation. Currently most HTML 2.0 elements +are supported except for images. Table support is primitive at best. + +<P>Even so, it provides enough capabilities to be used for on-line help and +other HTML applications. + +<H2>Implementation</H2> + +<P>The <CODE>HelpDialog</CODE> widget combines a dialog window, history buttons, +text size buttons, and the <CODE>HelpView</CODE> widget to provide an embedded +HTML file viewing dialog. + +<H2>Using the HelpDialog Widget</H2> + +<P>To use the <CODE>HelpDialog</CODE> widget in your program, do: + +<UL><PRE> +#include "HelpDialog.h" + +... + +{ + HelpDialog help(); + + help.load("filename.html"); + help.show(); + while (help.visible()) + Fl::wait(); +} +</PRE></UL> + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/home.xbm b/SrcUnix/espws-2.0/home.xbm new file mode 100644 index 0000000..f8ade7c --- /dev/null +++ b/SrcUnix/espws-2.0/home.xbm @@ -0,0 +1,6 @@ +#define home_width 16 +#define home_height 16 +static unsigned char home_bits[] = { + 0x80, 0x01, 0x40, 0x3a, 0x20, 0x2c, 0x10, 0x28, 0x08, 0x30, 0x04, 0x20, + 0x06, 0x60, 0x05, 0xa0, 0x74, 0x2f, 0x54, 0x29, 0x54, 0x29, 0x74, 0x29, + 0x04, 0x2b, 0x04, 0x29, 0x04, 0x29, 0xfc, 0x3f}; diff --git a/SrcUnix/espws-2.0/index.html b/SrcUnix/espws-2.0/index.html new file mode 100644 index 0000000..d0946b3 --- /dev/null +++ b/SrcUnix/espws-2.0/index.html @@ -0,0 +1,57 @@ +<HTML> +<HEAD> + <TITLE>Home Page - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> + <MAP NAME="navbar"> + <AREA SHAPE="RECT" COORDS="14,8,51,21" HREF="http://www.easysw.com" ALT="ESP Home Page"> + <AREA SHAPE="RECT" COORDS="82,8,128,21" HREF="index.html" ALT="Widget Set Home Page"> + <AREA SHAPE="RECT" COORDS="150,8,269,21" HREF="documentation.html" ALT="Widget Set Documentation"> + <AREA SHAPE="RECT" COORDS="291,8,369,21" HREF="download.html" ALT="Download Widget Set"> + <AREA SHAPE="RECT" COORDS="391,8,434,21" HREF="http://www.fltk.org" ALT="FLTK Home Page"> + </MAP> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<P ALIGN="CENTER"> +<IMG SRC="navbar.gif" WIDTH="449" HEIGHT="30" BORDER="0" ISMAP USEMAP="#navbar"> +<BR> +<A HREF="http://www.easysw.com">ESP</A> | +<A HREF="index.html">Home</A> | +<A HREF="documentation.html">Documentation</A> | +<A HREF="download.html">Download</A> | +<A HREF="http://www.fltk.org">FLTK</A> +</P> + +<H1 ALIGN="CENTER">ESP Widget Set for FLTK</H1> + +The ESP Widget Set for FLTK provides check button, file +chooser, help viewer, and wizard widgets for FLTK. These widgets are +provided under the terms of the +<A HREF="http://www.fsf.org/copyleft/gpl.html"> GNU General Public +License</A>. +<P> +<TABLE WIDTH="100%" CELLSPACING="0" CELLPADDING="0"> +<TR> + <TD VALIGN="TOP"><A HREF="flsurf.html"> + <IMG SRC="flsurf.gif" WIDTH="276" HEIGHT="196" BORDER="0" ALT="flsurf application"></A> + </TD> + <TD> </TD> + <TD VALIGN="TOP"><H2>News</H2> + <P><B>March 19, 2000</B> + <P>FileChooser and HelpDialog distributions merged into new + ESP Widget Set 2.0 distribution. The new distribution includes + "flsurf" (shown at left), a simple web browser for FLTK using the + HelpApp widget. + </TD> +</TR> +</TABLE> + +<HR> + +<P>Copyright 1997-2000 by Easy Software Products. This software is provided +under the terms of the <A HREF="http://www.fsf.org/copyleft/gpl.html"> +GNU General Public License</A>. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/intro.html b/SrcUnix/espws-2.0/intro.html new file mode 100644 index 0000000..f07f9c1 --- /dev/null +++ b/SrcUnix/espws-2.0/intro.html @@ -0,0 +1,57 @@ +<HTML> +<HEAD> + <TITLE>ESP Widget Set for FLTK</TITLE> + <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2000"> + <META NAME="AUTHOR" CONTENT="Easy Software Products"> + <META NAME="DOCNUMBER" CONTENT="ESPWS-2.0"> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>Introduction</H1> + +<P>The ESP Widget Set for FLTK provides check button, file +chooser, help viewer, and wizard widgets for FLTK. These widgets are +provided under the terms of the +<A HREF="http://www.fsf.org/copyleft/gpl.html">GNU General Public +License</A>. + +<P>The widget set comes with a configure script for UNIX systems and +Visual C++ workspace and project files for Windows systems. + +<H2>Compiling the Widget Set under UNIX</H2> + +<P>First you must configure the makefile for use on your system; in most +cases you just need to do: + +<UL><PRE> +% <KBD>./configure <I>ENTER</I></KBD> +</PRE></UL> + +<P>If the configure script is unable to determine what C and C++ compilers +to use, set the <CODE>CC</CODE> and <CODE>CXX</CODE> environment variables +to the corresponding program. + +<P>The <CODE>CFLAGS</CODE>, <CODE>CXXFLAGS</CODE>, and <CODE>LDFLAGS</CODE> +environment variables can also be set to tell the compilers and linker +where to find include files and libraries. + +<P>Once you have successfully configured the makefile, just type: + +<UL><PRE> +% <KBD>make <I>ENTER</I></KBD> +</PRE></UL> + +<P>to build the widget set and all the examples. + +<H2>Compiling the Widget Set under Windows</H2> + +<P>The Visual C++ project file was created using Visual C++ 6.0. We do not +recommend using older versions of Visual C++. + +<P>To build the widget set and all the examples, open the "espws" workspace +and do a batch build. + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/navbar.gif b/SrcUnix/espws-2.0/navbar.gif Binary files differnew file mode 100644 index 0000000..c655003 --- /dev/null +++ b/SrcUnix/espws-2.0/navbar.gif diff --git a/SrcUnix/espws-2.0/new.xbm b/SrcUnix/espws-2.0/new.xbm new file mode 100644 index 0000000..25a56c5 --- /dev/null +++ b/SrcUnix/espws-2.0/new.xbm @@ -0,0 +1,6 @@ +#define new_width 16 +#define new_height 16 +static unsigned char new_bits[] = { + 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x01, 0x01, 0xfe, 0x01, 0x80, + 0x31, 0x80, 0x31, 0x80, 0xfd, 0x80, 0xfd, 0x80, 0x31, 0x80, 0x31, 0x80, + 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, 0x00, 0x00}; diff --git a/SrcUnix/espws-2.0/next.xbm b/SrcUnix/espws-2.0/next.xbm new file mode 100644 index 0000000..753be4a --- /dev/null +++ b/SrcUnix/espws-2.0/next.xbm @@ -0,0 +1,12 @@ +#define next_width 42 +#define next_height 16 +static unsigned char next_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x02, 0x00, 0x00, 0x04, 0x00, 0x14, 0x02, 0x00, 0x08, 0x0c, 0x00, + 0x14, 0x02, 0x00, 0x08, 0x1c, 0x00, 0x24, 0xe2, 0x19, 0x1f, 0x3c, 0x00, + 0x24, 0x32, 0x13, 0x09, 0x7c, 0x00, 0x44, 0x12, 0xa2, 0x08, 0xfc, 0x00, + 0x44, 0xf2, 0x43, 0x08, 0xfc, 0x00, 0x84, 0x12, 0x40, 0x08, 0x7c, 0x00, + 0x84, 0x12, 0xa0, 0x08, 0x3c, 0x00, 0x04, 0x33, 0x13, 0x09, 0x1c, 0x00, + 0x04, 0xe3, 0x19, 0x33, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; diff --git a/SrcUnix/espws-2.0/prev.xbm b/SrcUnix/espws-2.0/prev.xbm new file mode 100644 index 0000000..f66fda6 --- /dev/null +++ b/SrcUnix/espws-2.0/prev.xbm @@ -0,0 +1,12 @@ +#define prev_width 42 +#define prev_height 16 +static unsigned char prev_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf8, 0x01, 0x00, 0x08, 0x00, 0x60, 0x08, 0x03, 0x00, 0x08, 0x00, + 0x70, 0x08, 0x02, 0x00, 0x08, 0x00, 0x78, 0x08, 0xe2, 0xe1, 0x89, 0x00, + 0x7c, 0x08, 0x31, 0x33, 0x4b, 0x00, 0x7e, 0xf8, 0x00, 0x12, 0x28, 0x00, + 0x7e, 0x08, 0xe1, 0x13, 0x18, 0x00, 0x7c, 0x08, 0x32, 0x12, 0x28, 0x00, + 0x78, 0x08, 0x12, 0x12, 0x4a, 0x00, 0x70, 0x08, 0x33, 0x33, 0x8b, 0x00, + 0x60, 0xf8, 0xe1, 0xe6, 0x09, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; diff --git a/SrcUnix/espws-2.0/relnotes.html b/SrcUnix/espws-2.0/relnotes.html new file mode 100644 index 0000000..555e213 --- /dev/null +++ b/SrcUnix/espws-2.0/relnotes.html @@ -0,0 +1,209 @@ +<HTML> +<HEAD> + <TITLE>Release Notes - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>Release Notes</H1> + +<H2>Changes in v2.0</A></H2> + +<UL> + + <LI><B>Merged FileChooser and HelpDialog distributions</B> + + <LI>Got rid of several compiler warnings (converting from float to int). + + <LI>Open files in binary mode (workaround for MSVC++ C library + problems) + + <LI>Fixed scrollbar problems. + + <LI>Fixed <CODE>HR</CODE> problems (wasn't adding x() and y() offset.) + + <LI>New <CODE>h()</CODE>, <CODE>position()</CODE>, <CODE>resize()</CODE>, + <CODE>w()</CODE>, <CODE>x()</CODE>, and <CODE>y()</CODE> methods to + control help dialog window. + + <LI>New <CODE>link()</CODE> callback method - allows you to support + loading of data from other locations. + + <LI>New <CODE>textcolor()</CODE> methods to control default text + color. + + <LI>Now support <CODE>TABLE</CODE> border and width attributes. + + <LI>Now support <CODE>BODY</CODE> color attributes. + + <LI>Now support horizontal alignment. + + <LI>Now support table background colors. + + <LI>New <CODE>flsurf</CODE> application that supports limited web + browsing, etc. (web browsing requires CUPS library) + + <LI>F_OK wasn't defined under Windows. + + <LI>FileIcon::load() didn't check the filename extension + properly - it was missing the ".". + + <LI>FileIcon::load_xpm() needed to use a case-insensitive + comparison for color names. + + <LI>The KDE load_kde_mimelnk() function had the fopen() + check backwards. + + <LI>Some of the old FTI code still used NULL for the + outline index, but GCC 2.95 didn't like that. + + <LI>Added support for column_widths() and column_char() + methods from the Fl_Browser widget. + + <LI>OS/2 fixes from Alexander Mai. + +</UL> + +<H2>Changes in HelpView v1.0.1</H2> + +<UL> + + <LI>Now include a makefile and configure script. + +</UL> + +<H2>Changes in FileChooser v1.4.2</H2> + +<UL> + + <LI>FileBrowser::load() didn't handle unreadable directories. + + <LI>FileIcon::load_fti() could store the outline color in freed + memory. + + <LI>FileIcon::load_system_icons() now uses default icons that + look like Microsoft Windows icons. + + <LI>FileIcon::load_system_icons() now supports GNOME and KDE + icons. + + <LI>FileIcon::draw() now accepts an "active" flag so that + inactive controls are drawn with inactive icons. + +</UL> + +<H2>Changes in FileChooser v1.4.1</H2> + +<UL> + + <LI>Now include a makefile and configure script. + + <LI>Added missing XBM icon files. + +</UL> + +<H2>Changes in FileChooser v1.4</H2> + +<UL> + + <LI>Now provided under the LGPL. + + <LI>Pressing the Cancel button, hitting escape, or closing the + dialog window clears the FileChooser value. + + <LI>The FileIcon class now loads icons for CDE and the IRIX + Interactive Desktop (auto-detect at run-time.) Support for + GNOME, KDE, and Windows is in the works. + + <LI>The FileIcon class now provides a <CODE>label()</CODE> method + for using icons as labels for widgets. + +</UL> + +<H2>Changes in FileChooser v1.3</H2> + +<UL> + + <LI>Added new <CODE>FileInput</CODE> widget (world's shortest + widget! :) so that filename completion can be done with the + Tab, End, or right arrow key. + + <LI>The <CODE>FileChooser</CODE> widget now uses the + <CODE>FileInput</CODE> widget instead of <CODE>Fl_Input</CODE>. + + <LI>The text selection in the filename field now puts the cursor + at the end of the selection (unless you type the Backspace key.) + +</UL> + +<H2>Changes in FileChooser v1.2</H2> + +<UL> + + <LI>Fixed VC++ compile problems. + + <LI>Filename completion now scrolls the file list to the first matching + file and selects it when it matches exactly. + + <LI>The <code>value()</code> method incorrectly reset the chooser + type to <code>FileChooser::SINGLE</code> when the type was + <code>FileChooser::CREATE</code>. + + <LI>The <code>value()</code> method didn't handle directories without + filenames properly (always showed drives/file systems). + + <LI>The "new directory" button is now only activated when the + chooser type is <code>FileChooser::CREATE</code>. + + <LI>The "OK" button is now disabled until a filename is selected or + entered on the keyboard. + + <LI>Previously the chooser would only beep at the user when a non- + existing filename was entered for <code>SINGLE</code> and + <code>MULTI</code> type choosers. It now also pops up an alert + dialog with the text, "Please choose an existing file!" + + <LI>Added <code>iconsize()</code>, <code>textcolor()</code>, + <code>textfont()</code>, and <code>textsize()</code> methods to + the <code>FileChooser</code> class. + + <LI>The chooser no longer loads any icons by default; call the + new <code>load_system_icons()</code> method in the + <code>FileIcon</code> class to get the icons. + + <LI>The <code>FileBrowser</code> widget now has <code>iconsize()</code> + methods to control the size of the icons separately from the text font. + + <LI>The <code>FileBrowser</code> widget now supports tabs and newlines + in the item string. + + <LI>Added <code>iconsize</code>, <code>textcolor</code>, + <code>textfont</code>, and <code>textsize</code> methods to the + <code>FileChooser</code> class. + +</UL> + +<H2>Changes in FileChooser v1.1</H2> + +<UL> + + <LI>The <code>FileChooser::value()</code> method now has a default + argument of 1. + + <LI>Changed the <code>multi</code> methods and arguments to + <code>type</code> so that the chooser can limit selection to existing + files if necessary. + + <LI>Added a <code>FileChooser::value(pathname)</code> method to + set the current selection and/or directory. + + <LI>The file completion code now handles directory navigation when + you press "/". + + <LI>The filename field now gets the full width of the window. + +</UL> + +</BODY> +</HTML> diff --git a/SrcUnix/espws-2.0/reload.xbm b/SrcUnix/espws-2.0/reload.xbm new file mode 100644 index 0000000..587b530 --- /dev/null +++ b/SrcUnix/espws-2.0/reload.xbm @@ -0,0 +1,6 @@ +#define reload_width 16 +#define reload_height 16 +static unsigned char reload_bits[] = { + 0x00, 0x00, 0xe0, 0x07, 0xf0, 0x0f, 0x38, 0x1c, 0x18, 0x38, 0x00, 0x70, + 0x00, 0xf8, 0x04, 0x70, 0x0e, 0x20, 0x1f, 0x00, 0x0e, 0x00, 0x1c, 0x18, + 0x38, 0x1c, 0xf0, 0x0f, 0xe0, 0x07, 0x00, 0x00}; diff --git a/SrcUnix/espws-2.0/reset.xbm b/SrcUnix/espws-2.0/reset.xbm new file mode 100644 index 0000000..7335374 --- /dev/null +++ b/SrcUnix/espws-2.0/reset.xbm @@ -0,0 +1,4 @@ +#define reset_width 8 +#define reset_height 8 +static unsigned char reset_bits[] = { + 0xff, 0x81, 0xbd, 0xbd, 0xbd, 0xbd, 0x81, 0xff}; diff --git a/SrcUnix/espws-2.0/stop.xbm b/SrcUnix/espws-2.0/stop.xbm new file mode 100644 index 0000000..8ae52fe --- /dev/null +++ b/SrcUnix/espws-2.0/stop.xbm @@ -0,0 +1,6 @@ +#define stop_width 16 +#define stop_height 16 +static unsigned char stop_bits[] = { + 0xe0, 0x07, 0xf0, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, 0xff, + 0x89, 0xcd, 0xdd, 0xaa, 0xd9, 0xca, 0xdb, 0xea, 0xd9, 0xed, 0xff, 0x7f, + 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x07}; diff --git a/SrcUnix/espws-2.0/testfile.cxx b/SrcUnix/espws-2.0/testfile.cxx new file mode 100644 index 0000000..c8f56bb --- /dev/null +++ b/SrcUnix/espws-2.0/testfile.cxx @@ -0,0 +1,141 @@ +// +// "$Id: testfile.cxx,v 1.6 2000/01/04 13:45:55 mike Exp $" +// +// File chooser test program. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outlined in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// main() - Create a file chooser and wait for a selection to be +// made. +// close_callback() - Close the main window... +// show_callback() - Show the file chooser... +// + +// +// Include necessary headers... +// + +#include <stdio.h> +#include "FileChooser.h" + + +// +// Globals... +// + +Fl_Input *filter; +FileChooser *fc; + + +// +// Functions... +// + +void close_callback(void); +void show_callback(void); + + +// +// 'main()' - Create a file chooser and wait for a selection to be made. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + Fl_Window *window;// Main window + Fl_Button *button;// Buttons + FileIcon *icon; // New file icon + + + // Make the file chooser... + FileIcon::load_system_icons(); + + fc = new FileChooser(".", "*", FileChooser::MULTI, "FileChooser Test"); + fc->color((Fl_Color)196); + + // Make the main window... + window = new Fl_Window(400, 80, "File Chooser Test"); + + filter = new Fl_Input(50, 10, 315, 25, "Filter:"); + if (argc > 1) + filter->value(argv[1]); + + button = new Fl_Button(365, 10, 25, 25); + button->labelcolor(FL_YELLOW); + button->callback((Fl_Callback *)show_callback); + + icon = FileIcon::find(".", FileIcon::DIRECTORY); + icon->label(button); + + button = new Fl_Button(340, 45, 50, 25, "Close"); + button->callback((Fl_Callback *)close_callback); + + window->end(); + window->show(); + + Fl::run(); + + return (0); +} + + +// +// 'close_callback()' - Close the main window... +// + +void +close_callback(void) +{ + exit(0); +} + + +// +// 'show_callback()' - Show the file chooser... +// + +void +show_callback(void) +{ + int i; // Looping var + int count; // Number of files selected + + + fc->show(); + if (filter->value()[0]) + fc->filter(filter->value()); + + fc->show(); + + while (fc->visible()) + Fl::wait(); + + count = fc->count(); + printf("count = %d\n", count); + for (i = 1; i <= count; i ++) + printf("file %d = \"%s\"\n", i, fc->value(i)); +} + + +// +// End of "$Id: testfile.cxx,v 1.6 2000/01/04 13:45:55 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/testhelp.cxx b/SrcUnix/espws-2.0/testhelp.cxx new file mode 100644 index 0000000..ed0ff35 --- /dev/null +++ b/SrcUnix/espws-2.0/testhelp.cxx @@ -0,0 +1,66 @@ +// +// "$Id: testhelp.cxx,v 1.3 2000/01/04 13:45:56 mike Exp $" +// +// Help test program. +// +// Copyright 1997-2000 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Easy Software Products and are protected by Federal +// copyright law. Distribution and use rights are outblockd in the file +// "COPYING" which should have been included with this file. If this +// file is missing or damaged please contact Easy Software Products +// at: +// +// Attn: ESP Licensing Information +// Easy Software Products +// 44141 Airport View Drive, Suite 204 +// Hollywood, Maryland 20636-3111 USA +// +// Voice: (301) 373-9600 +// EMail: info@easysw.com +// WWW: http://www.easysw.com +// +// Contents: +// +// main() - Display the help GUI... +// + +// +// Include necessary headers... +// + +#include "HelpDialog.h" + + +// +// 'main()' - Display the help GUI... +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + HelpDialog *help; // Help dialog + + + help = new HelpDialog; + + if (argc < 2) + help->load("HelpDialog.html"); + else + help->load(argv[1]); + + help->show(); + + Fl::run(); + + delete help; + + return (0); +} + + +// +// End of "$Id: testhelp.cxx,v 1.3 2000/01/04 13:45:56 mike Exp $". +// diff --git a/SrcUnix/espws-2.0/up.xbm b/SrcUnix/espws-2.0/up.xbm new file mode 100644 index 0000000..1a4f4b7 --- /dev/null +++ b/SrcUnix/espws-2.0/up.xbm @@ -0,0 +1,6 @@ +#define up_width 16 +#define up_height 16 +static unsigned char up_bits[] = { + 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x01, 0x31, 0xfe, 0x79, 0x80, + 0xfd, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, + 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, 0x00, 0x00}; diff --git a/SrcUnix/espws-2.0/widgets.html b/SrcUnix/espws-2.0/widgets.html new file mode 100644 index 0000000..bf6fc48 --- /dev/null +++ b/SrcUnix/espws-2.0/widgets.html @@ -0,0 +1,61 @@ +<HTML> +<HEAD> + <TITLE>Widgets - ESP Widget Set for FLTK</TITLE> + <LINK REL="STYLESHEET" TYPE="text/css" HREF="fltk.css"> +</HEAD> + +<BODY BGCOLOR="#ccccff"> + +<H1>Widgets</H1> + +<P>The widget set includes several base and composite widgets. The base widgets +include: + +<UL> + + <LI><A HREF="CheckButton.html"><CODE>CheckButton</CODE></A>, a + better looking check/radio button. + + <LI><A HREF="FileBrowser.html"><CODE>FileBrowser</CODE></A>, a + browser widget that supports file icons. + + <LI><A HREF="FileIcon.html"><CODE>FileIcon</CODE></A>, a class + for managing and drawing file icons. + + <LI><A HREF="Fl_Wizard.html"><CODE>Fl_Wizard</CODE></A>, an + adaptation of the <CODE>Fl_Tabs</CODE> widget for "wizard" + interfaces. + + <LI><A HREF="HelpView.html"><CODE>HelpView</CODE></A>, a simple + HTML viewing widget. + +</UL> + +<P>Technically, the <CODE>FileIcon</CODE> class is not a FLTK widget, +however it does provide a <CODE>label()</CODE> method for widgets, +much like <CODE>Fl_Pixmap</CODE>. + +<P>The composite widgets include: + +<UL> + + <LI><A HREF="FileChooser.html"><CODE>FileChooser</CODE></A>, a + complete file chooser dialog using the <CODE>FileBrowser</CODE>, + <CODE>FileIcon</CODE>, and <CODE>FileInput</CODE> widgets. + + <LI><A HREF="HelpDialog.html"><CODE>HelpDialog</CODE></A>, a + complete help dialog using the <CODE>HelpView</CODE> widget. + + <LI><A HREF="HelpApp.html"><CODE>HelpApp</CODE></A>, a + simple web browser using the <CODE>FileChooser</CODE> and + <CODE>HelpView</CODE> widgets. + +</UL> + +<P>The <CODE>HelpDialog</CODE> widget is designed for embedded use within +a FLTK application, while the <CODE>HelpApp</CODE> widget provides the +framework for a complete application, such as the +<A HREF="flsurf.html">flsurf</A> application included with the widget set. + +</BODY> +</HTML> diff --git a/SrcUnix/espws.diff b/SrcUnix/espws.diff new file mode 100644 index 0000000..877cbab --- /dev/null +++ b/SrcUnix/espws.diff @@ -0,0 +1,139 @@ +diff -Naur espws-2.0-orig/FileChooser.cxx espws-2.0/FileChooser.cxx +--- espws-2.0-orig/FileChooser.cxx Tue Feb 29 10:45:55 2000 ++++ espws-2.0/FileChooser.cxx Mon Jul 23 18:27:45 2001 +@@ -128,7 +128,7 @@ + { Fl_Choice* o = dirMenu = new Fl_Choice(75, 10, 200, 25, "Directory:"); + o->callback((Fl_Callback*)cb_dirMenu); + } +- { Fl_Button* o = new Fl_Button(340, 10, 25, 25); ++ { Fl_Button* o = allFiles = new Fl_Button(340, 10, 25, 25); + bitmap_allfiles.label(o); + o->labelsize(28); + o->labelcolor(4); +@@ -140,6 +140,7 @@ + o->end(); + } + window->size_range(345, 270, 345); ++directory_chooser_ = false; + fileList->filter(p); + type(t); + value(d); +@@ -216,6 +217,14 @@ + } + + void FileChooser::type(int t) { ++ if (t == DIRECTORY) ++ { ++ t = SINGLE; ++ directory_chooser_ = true; ++ allFiles->deactivate(); ++ fileList->filter("-_-_-_-_-_-"); /* Match that! */ ++ } ++ + type_ = t; + if (t == MULTI) + fileList->type(FL_MULTI_BROWSER); +diff -Naur espws-2.0-orig/FileChooser.h espws-2.0/FileChooser.h +--- espws-2.0-orig/FileChooser.h Tue Feb 29 10:45:55 2000 ++++ espws-2.0/FileChooser.h Mon Jul 23 18:27:45 2001 +@@ -15,7 +15,7 @@ + + class FileChooser { + public: +- enum { SINGLE, MULTI, CREATE }; ++ enum { SINGLE, MULTI, CREATE, DIRECTORY }; + FileChooser(const char *d, const char *p, int t, const char *title); + private: + Fl_Window *window; +@@ -41,10 +41,12 @@ + Fl_Choice *dirMenu; + inline void cb_dirMenu_i(Fl_Choice*, void*); + static void cb_dirMenu(Fl_Choice*, void*); ++ Fl_Button *allFiles; + inline void cb_allfiles_i(Fl_Button*, void*); + static void cb_allfiles(Fl_Button*, void*); + char directory_[1024]; + int type_; ++ int directory_chooser_; + void fileListCB(); + void fileNameCB(); + void newdir(); +diff -Naur espws-2.0-orig/FileChooser2.cxx espws-2.0/FileChooser2.cxx +--- espws-2.0-orig/FileChooser2.cxx Tue Jan 4 05:45:51 2000 ++++ espws-2.0/FileChooser2.cxx Mon Jul 23 18:27:45 2001 +@@ -170,7 +170,7 @@ + pathname[sizeof(pathname) - 1] = '\0'; + } + +- if (filename_isdir(pathname)) ++ if (filename_isdir(pathname) && !directory_chooser_) + return (0); + else + return (1); +@@ -189,7 +189,7 @@ + pathname[sizeof(pathname) - 1] = '\0'; + } + +- if (!filename_isdir(pathname)) ++ if (!filename_isdir(pathname) || directory_chooser_) + count ++; + } + +@@ -209,6 +209,16 @@ + const char *name; // Current filename + static char pathname[1024]; // Filename + directory + ++// There seems to be a little bit of a bug...sometimes ++// the returned path can start with '//'. I think the ++// Unix file system handles this OK ("ls //tmp" works), ++// but lets clean it up anyway. ++ ++ if (strlen (directory_) >= 2 && ++ directory_[0] == '/' && directory_[1] == '/') ++ { ++ memmove (directory_, directory_ + 1, strlen (directory_)); ++ } + + if (type_ != MULTI) + { +@@ -227,7 +237,7 @@ + name = fileList->text(i); + sprintf(pathname, "%s/%s", directory_, name); + +- if (!filename_isdir(pathname)) ++ if (!filename_isdir(pathname) || directory_chooser_) + { + // Nope, see if this this is "the one"... + count ++; +@@ -427,7 +437,7 @@ + { + fileName->value(filename); + +- if (!filename_isdir(pathname)) ++ if (!filename_isdir(pathname) || directory_chooser_) + okButton->activate(); + } + } +@@ -487,10 +497,10 @@ + // Enter pressed - select or change directory... + + #if defined(WIN32) || defined(__EMX__) +- if ((strlen(pathname) == 2 && pathname[1] == ':') || +- filename_isdir(pathname)) ++ if (((strlen(pathname) == 2 && pathname[1] == ':') || ++ filename_isdir(pathname)) && !directory_chooser_) + #else +- if (filename_isdir(pathname)) ++ if (filename_isdir(pathname) && !directory_chooser_) + #endif /* WIN32 || __EMX__ */ + directory(pathname); + else if (type_ == CREATE || access(pathname, 0) == 0) +@@ -622,7 +632,7 @@ + sprintf(pathname, "%s/%s", directory_, fileName->value()); + + if ((type_ == CREATE || access(pathname, 0) == 0) && +- !filename_isdir(pathname)) ++ (!filename_isdir(pathname) || directory_chooser_)) + okButton->activate(); + else + okButton->deactivate(); diff --git a/SrcUnix/jconfig.h b/SrcUnix/jconfig.h new file mode 100644 index 0000000..afe7249 --- /dev/null +++ b/SrcUnix/jconfig.h @@ -0,0 +1,46 @@ +/* -*- mode: C++; tab-width: 4 -*- */ +/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, per Windows custom */ +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Microsoft has setmode() */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/SrcUnix/poser.xpm b/SrcUnix/poser.xpm new file mode 100644 index 0000000..6f01368 --- /dev/null +++ b/SrcUnix/poser.xpm @@ -0,0 +1,54 @@ +/* XPM */ +static char * poser_xpm[] = { +"38 39 12 1", +" c None", +". c #C5C2C5", +"+ c #525252", +"@ c #212121", +"# c #000000", +"$ c #003163", +"% c #CECE00", +"& c #9C9C63", +"* c #424242", +"= c #639C63", +"- c #737373", +"; c #313131", +"......................................", +"......................................", +"......................................", +"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+...", +"....#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#...", +"....#$$$$%%%%$%%$%%%%$$$$$$$$$$$$@#...", +".....#$$$$$%%%##%%%$$$$$$$$$$$$$@#....", +"......#$$$$$$$%%$$$$$$$$$$$$$$$@#.....", +".......#$$$$$$$$$$$$$$$$$$$@@@@#......", +".......#$$$$$$$$$$$$$$$$$$$$$$@#......", +".......#%%%%%%%%%%%%%%%%$%$$$$@#......", +".......#########################......", +"......####################&@**@.......", +".....####################&&@**@.......", +"....@###################&=&@**@.......", +"....@#################*&=&&@**@.......", +"....+@#############@*=&=&=&@**@.......", +"........@**@=&=&=&=&=&=&=&&@**@.......", +"........@**@&=&=&=&=&=&=&=&@**@.......", +"........@**@==============&@**@.......", +"........@**@&&&&&&&&&&&&&&&@**@.......", +"........@**@-+-&-&-&-&-&-+-@**@.......", +"........@**@+&+&&&&&&&&&+&+@**@.......", +"........@**@-+-&&&&&&&&&-+-@**@.......", +"........@**@&&&&&&&&&&&&&&&@**@.......", +"........@**@-+-&&&&&&&&&-+-@**@.......", +"........@**@+&+&&&&&&&&&+&+@**@.......", +"........@**@-+-&-&-&-&-&-+-@**@.......", +"........@**;@@@@@@@@@@@@@@@;**@.......", +"........@*********************@.......", +"........@@@;;****************;@.......", +".........@;;@@;;*********;;@@@........", +".........@***;;@@@@@@@@@@@;;*@........", +".........@*******************@........", +".........+@@@@@@@@@@@@@@@@@@@+........", +"......................................", +"......................................", +"......................................", +"......................................"}; |