aboutsummaryrefslogtreecommitdiff
path: root/SrcUnix
diff options
context:
space:
mode:
Diffstat (limited to 'SrcUnix')
-rw-r--r--SrcUnix/DefaultLarge.xpm732
-rw-r--r--SrcUnix/DefaultSmall.xpm401
-rw-r--r--SrcUnix/EmApplicationFltk.cpp494
-rw-r--r--SrcUnix/EmApplicationFltk.h50
-rw-r--r--SrcUnix/EmCommonUnix.h90
-rw-r--r--SrcUnix/EmDirRefUnix.cpp506
-rw-r--r--SrcUnix/EmDirRefUnix.h19
-rw-r--r--SrcUnix/EmDlgFltk.cpp2497
-rw-r--r--SrcUnix/EmDlgFltk.h62
-rw-r--r--SrcUnix/EmDlgFltkFactory.fl1157
-rw-r--r--SrcUnix/EmDocumentUnix.cpp142
-rw-r--r--SrcUnix/EmDocumentUnix.h40
-rw-r--r--SrcUnix/EmFileRefUnix.cpp547
-rw-r--r--SrcUnix/EmFileRefUnix.h19
-rw-r--r--SrcUnix/EmMenusFltk.cpp94
-rw-r--r--SrcUnix/EmMenusFltk.h25
-rw-r--r--SrcUnix/EmPixMapUnix.cpp48
-rw-r--r--SrcUnix/EmPixMapUnix.h22
-rw-r--r--SrcUnix/EmTransportSerialUnix.cpp1211
-rw-r--r--SrcUnix/EmTransportSerialUnix.h68
-rw-r--r--SrcUnix/EmTransportUSBUnix.cpp394
-rw-r--r--SrcUnix/EmTransportUSBUnix.h36
-rw-r--r--SrcUnix/EmWindowFltk.cpp777
-rw-r--r--SrcUnix/EmWindowFltk.h78
-rw-r--r--SrcUnix/Platform_Unix.cpp850
-rw-r--r--SrcUnix/ResStrings.h19
-rw-r--r--SrcUnix/espws-2.0/CheckButton.cxx113
-rw-r--r--SrcUnix/espws-2.0/CheckButton.h52
-rw-r--r--SrcUnix/espws-2.0/CheckButton.html61
-rw-r--r--SrcUnix/espws-2.0/FileBrowser.cxx518
-rw-r--r--SrcUnix/espws-2.0/FileBrowser.h71
-rw-r--r--SrcUnix/espws-2.0/FileBrowser.html79
-rw-r--r--SrcUnix/espws-2.0/FileChooser.cxx249
-rw-r--r--SrcUnix/espws-2.0/FileChooser.fl189
-rw-r--r--SrcUnix/espws-2.0/FileChooser.gifbin0 -> 10760 bytes
-rw-r--r--SrcUnix/espws-2.0/FileChooser.h82
-rw-r--r--SrcUnix/espws-2.0/FileChooser.html172
-rw-r--r--SrcUnix/espws-2.0/FileChooser2.cxx645
-rw-r--r--SrcUnix/espws-2.0/FileIcon.cxx1217
-rw-r--r--SrcUnix/espws-2.0/FileIcon.h112
-rw-r--r--SrcUnix/espws-2.0/FileIcon.html165
-rw-r--r--SrcUnix/espws-2.0/FileInput.cxx75
-rw-r--r--SrcUnix/espws-2.0/FileInput.h52
-rw-r--r--SrcUnix/espws-2.0/FileInput.html56
-rw-r--r--SrcUnix/espws-2.0/Fl_Wizard.cxx201
-rw-r--r--SrcUnix/espws-2.0/Fl_Wizard.h59
-rw-r--r--SrcUnix/espws-2.0/Fl_Wizard.html75
-rw-r--r--SrcUnix/espws-2.0/HelpApp.cxx470
-rw-r--r--SrcUnix/espws-2.0/HelpApp.fl380
-rw-r--r--SrcUnix/espws-2.0/HelpApp.gifbin0 -> 7556 bytes
-rw-r--r--SrcUnix/espws-2.0/HelpApp.h135
-rw-r--r--SrcUnix/espws-2.0/HelpApp2.cxx546
-rw-r--r--SrcUnix/espws-2.0/HelpDialog.cxx219
-rw-r--r--SrcUnix/espws-2.0/HelpDialog.fl188
-rw-r--r--SrcUnix/espws-2.0/HelpDialog.gifbin0 -> 12984 bytes
-rw-r--r--SrcUnix/espws-2.0/HelpDialog.h53
-rw-r--r--SrcUnix/espws-2.0/HelpDialog.html89
-rw-r--r--SrcUnix/espws-2.0/HelpView.cxx1799
-rw-r--r--SrcUnix/espws-2.0/HelpView.h180
-rw-r--r--SrcUnix/espws-2.0/HelpView.html130
-rw-r--r--SrcUnix/espws-2.0/Makefile.in121
-rw-r--r--SrcUnix/espws-2.0/allfiles.xbm6
-rwxr-xr-xSrcUnix/espws-2.0/configure1865
-rw-r--r--SrcUnix/espws-2.0/configure.in69
-rw-r--r--SrcUnix/espws-2.0/documentation.html73
-rw-r--r--SrcUnix/espws-2.0/download.html54
-rw-r--r--SrcUnix/espws-2.0/espws.book18
-rw-r--r--SrcUnix/espws-2.0/espws.pdf1378
-rw-r--r--SrcUnix/espws-2.0/file.html76
-rw-r--r--SrcUnix/espws-2.0/flsurf.cxx67
-rw-r--r--SrcUnix/espws-2.0/flsurf.gifbin0 -> 4849 bytes
-rw-r--r--SrcUnix/espws-2.0/flsurf.html66
-rw-r--r--SrcUnix/espws-2.0/fltk.css6
-rw-r--r--SrcUnix/espws-2.0/help.html44
-rw-r--r--SrcUnix/espws-2.0/home.xbm6
-rw-r--r--SrcUnix/espws-2.0/index.html57
-rw-r--r--SrcUnix/espws-2.0/intro.html57
-rw-r--r--SrcUnix/espws-2.0/navbar.gifbin0 -> 2367 bytes
-rw-r--r--SrcUnix/espws-2.0/new.xbm6
-rw-r--r--SrcUnix/espws-2.0/next.xbm12
-rw-r--r--SrcUnix/espws-2.0/prev.xbm12
-rw-r--r--SrcUnix/espws-2.0/relnotes.html209
-rw-r--r--SrcUnix/espws-2.0/reload.xbm6
-rw-r--r--SrcUnix/espws-2.0/reset.xbm4
-rw-r--r--SrcUnix/espws-2.0/stop.xbm6
-rw-r--r--SrcUnix/espws-2.0/testfile.cxx141
-rw-r--r--SrcUnix/espws-2.0/testhelp.cxx66
-rw-r--r--SrcUnix/espws-2.0/up.xbm6
-rw-r--r--SrcUnix/espws-2.0/widgets.html61
-rw-r--r--SrcUnix/espws.diff139
-rw-r--r--SrcUnix/jconfig.h46
-rw-r--r--SrcUnix/poser.xpm54
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
new file mode 100644
index 0000000..5a72f62
--- /dev/null
+++ b/SrcUnix/espws-2.0/FileChooser.gif
Binary files differ
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
new file mode 100644
index 0000000..66c8fab
--- /dev/null
+++ b/SrcUnix/espws-2.0/HelpApp.gif
Binary files differ
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
new file mode 100644
index 0000000..e0f3cbf
--- /dev/null
+++ b/SrcUnix/espws-2.0/HelpDialog.gif
Binary files differ
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£
+ŠŽV 5¥Ï 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© D 7ˆÌ}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ÈPUuF FFYSÆœ>½©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”"Â6 i¹ƒç>Ø,ßè/‹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Ù†b XÙ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³ùŸ‚n K9¶µµØ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ÛâAU 3»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±/L inòЇÞ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 Z­q«
+!´­¾(§óÚ³úBa¹º8™1XPPNlßDl ø– ¤`e
+«Q­jR"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]c­k°]êP$t bMÛ #J[ЯOÛˆP¾÷ñùÞ;á`þpÌòp›+Y
+’T pqö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”Nk­Wñ¤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ºMRpHe­t³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‚‚µÀV 9@%Ø!
+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Ëx q½î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#7­xñ-ÕÆ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ŽY­xQi™Ï"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ãemh 8®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¿q IŽ'í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ó­"Ú¹uX Dâ)ºj»œÁáQÔe©õ$’¾'h'µ:s Œfoe9
+nîî{W^:¶ŠÆ ›.°4Å’ü3»,õ:·K_ l VǤ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
new file mode 100644
index 0000000..ab586e9
--- /dev/null
+++ b/SrcUnix/espws-2.0/flsurf.gif
Binary files differ
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 &lt;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>&nbsp;</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
new file mode 100644
index 0000000..c655003
--- /dev/null
+++ b/SrcUnix/espws-2.0/navbar.gif
Binary files differ
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",
+"......................................",
+"......................................",
+"......................................",
+"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+...",
+"....#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#...",
+"....#$$$$%%%%$%%$%%%%$$$$$$$$$$$$@#...",
+".....#$$$$$%%%##%%%$$$$$$$$$$$$$@#....",
+"......#$$$$$$$%%$$$$$$$$$$$$$$$@#.....",
+".......#$$$$$$$$$$$$$$$$$$$@@@@#......",
+".......#$$$$$$$$$$$$$$$$$$$$$$@#......",
+".......#%%%%%%%%%%%%%%%%$%$$$$@#......",
+".......#########################......",
+"......####################&@**@.......",
+".....####################&&@**@.......",
+"....@###################&=&@**@.......",
+"....@#################*&=&&@**@.......",
+"....+@#############@*=&=&=&@**@.......",
+"........@**@=&=&=&=&=&=&=&&@**@.......",
+"........@**@&=&=&=&=&=&=&=&@**@.......",
+"........@**@==============&@**@.......",
+"........@**@&&&&&&&&&&&&&&&@**@.......",
+"........@**@-+-&-&-&-&-&-+-@**@.......",
+"........@**@+&+&&&&&&&&&+&+@**@.......",
+"........@**@-+-&&&&&&&&&-+-@**@.......",
+"........@**@&&&&&&&&&&&&&&&@**@.......",
+"........@**@-+-&&&&&&&&&-+-@**@.......",
+"........@**@+&+&&&&&&&&&+&+@**@.......",
+"........@**@-+-&-&-&-&-&-+-@**@.......",
+"........@**;@@@@@@@@@@@@@@@;**@.......",
+"........@*********************@.......",
+"........@@@;;****************;@.......",
+".........@;;@@;;*********;;@@@........",
+".........@***;;@@@@@@@@@@@;;*@........",
+".........@*******************@........",
+".........+@@@@@@@@@@@@@@@@@@@+........",
+"......................................",
+"......................................",
+"......................................",
+"......................................"};