aboutsummaryrefslogtreecommitdiffstats
path: root/apps/windoze/CBuilder5/InstallMgr
diff options
context:
space:
mode:
authordanglassey <danglassey>2002-08-14 09:57:17 +0000
committerdanglassey <danglassey>2002-08-14 09:57:17 +0000
commitc9458897ebbb739d8db83c80e06512d8a612f743 (patch)
treef8c5381045887e34388cc6b26cfccc254bf766dc /apps/windoze/CBuilder5/InstallMgr
downloadsword-sf-cvs-c9458897ebbb739d8db83c80e06512d8a612f743.tar.gz
*** empty log message ***
Diffstat (limited to 'apps/windoze/CBuilder5/InstallMgr')
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp29
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/FTPDownload.h16
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp33
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfmbin0 -> 1132 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InfoFrm.h32
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg31
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr136
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp36
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/InstallMgr.resbin0 -> 1852 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp1110
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm2224
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/MainFrm.h146
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp160
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfmbin0 -> 3588 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h52
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp273
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfmbin0 -> 1093 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/StatusFrm.h89
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp15
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfmbin0 -> 675 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h26
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/arrow2r.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/arrow3u.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/back.bmpbin0 -> 798 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/bookshut.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/bulblk.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/bulbon.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/check.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp67
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfmbin0 -> 1278 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/cipherfrm.h37
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/delete.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/filenew.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/floppy.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/globe.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/insert.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/installmgr.conf8
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/query.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/sword.bmpbin0 -> 8950 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/trash.bmpbin0 -> 376 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/undo.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/upgdlk.bmpbin0 -> 374 bytes
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/zlib.bpf25
-rw-r--r--apps/windoze/CBuilder5/InstallMgr/zlib.bpr126
44 files changed, 4671 insertions, 0 deletions
diff --git a/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp
new file mode 100644
index 0000000..eb74177
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.cpp
@@ -0,0 +1,29 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FTPDownload.h"
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+// Important: Methods and properties of objects in VCL can only be
+// used in a method called using Synchronize, for example:
+//
+// Synchronize(UpdateCaption);
+//
+// where UpdateCaption could look like:
+//
+// void __fastcall FTPDownload::UpdateCaption()
+// {
+// Form1->Caption = "Updated in a thread";
+// }
+//---------------------------------------------------------------------------
+__fastcall FTPDownload::FTPDownload(bool CreateSuspended)
+ : TThread(CreateSuspended)
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall FTPDownload::Execute()
+{
+ //---- Place thread code here ----
+}
+//---------------------------------------------------------------------------
diff --git a/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h
new file mode 100644
index 0000000..4ad9e01
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/FTPDownload.h
@@ -0,0 +1,16 @@
+//---------------------------------------------------------------------------
+#ifndef FTPDownloadH
+#define FTPDownloadH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+//---------------------------------------------------------------------------
+class FTPDownload : public TThread
+{
+private:
+protected:
+ void __fastcall Execute();
+public:
+ __fastcall FTPDownload(bool CreateSuspended);
+};
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp
new file mode 100644
index 0000000..a75b7b2
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.cpp
@@ -0,0 +1,33 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "InfoFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TInfoForm *InfoForm;
+//---------------------------------------------------------------------------
+__fastcall TInfoForm::TInfoForm(TComponent* Owner)
+ : TForm(Owner)
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TInfoForm::FormShow(TObject *Sender)
+{
+ AnsiString abouttext = "";
+ TMemoryStream *RTFStream = new TMemoryStream();
+
+ abouttext = abouttext + "{\\fs20\\cf0 " + info.c_str() + " }";
+ RTFStream->Clear();
+ RTFStream->WriteBuffer(abouttext.c_str(), abouttext.Length());
+ RTFStream->Position = 0;
+ InfoText->Lines->LoadFromStream(RTFStream);
+ delete RTFStream;
+}
+//---------------------------------------------------------------------------
+void __fastcall TInfoForm::SpeedButton1Click(TObject *Sender)
+{
+ ModalResult = mrOk;
+}
+//---------------------------------------------------------------------------
diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm
new file mode 100644
index 0000000..ca189d0
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.dfm
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h
new file mode 100644
index 0000000..9bbeef6
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InfoFrm.h
@@ -0,0 +1,32 @@
+//---------------------------------------------------------------------------
+#ifndef InfoFrmH
+#define InfoFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Buttons.hpp>
+#include <ComCtrls.hpp>
+#include <ExtCtrls.hpp>
+#include <string>
+
+//---------------------------------------------------------------------------
+class TInfoForm : public TForm
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TPanel *Panel2;
+ TRichEdit *InfoText;
+ TSpeedButton *SpeedButton1;
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall SpeedButton1Click(TObject *Sender);
+private: // User declarations
+public: // User declarations
+ std::string info;
+ __fastcall TInfoForm(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TInfoForm *InfoForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg
new file mode 100644
index 0000000..792eb7c
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpg
@@ -0,0 +1,31 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = swordlib.lib zlib.lib libcurl.lib InstallMgr.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+InstallMgr.exe: InstallMgr.bpr
+ $(MAKE)
+
+swordlib.lib: ..\BibleCS\swordlib.bpr
+ $(MAKE)
+
+zlib.lib: zlib.bpr
+ $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $**
+ $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+libcurl.lib: libcurl.bpr
+ $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $**
+ $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak
+
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr
new file mode 100644
index 0000000..1b2a792
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.bpr
@@ -0,0 +1,136 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value="InstallMgr.exe"/>
+ <OBJFILES value="InstallMgr.obj MainFrm.obj StatusFrm.obj RemoteMntFrm.obj InfoFrm.obj
+ cipherfrm.obj UninstallFrm.obj"/>
+ <RESFILES value="InstallMgr.res"/>
+ <IDLFILES value=""/>
+ <IDLGENFILES value=""/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES) MainFrm.dfm StatusFrm.dfm RemoteMntFrm.dfm InfoFrm.dfm
+ cipherfrm.dfm UninstallFrm.dfm"/>
+ <LIBFILES value="zlib.lib ..\..\..\..\lib\swordlib.lib libcurl.lib curl\lib\ws2_32.lib"/>
+ <LIBRARIES value="vclx50.lib vcl50.lib"/>
+ <SPARELIBS value="vcl50.lib vclx50.lib"/>
+ <PACKAGES value="vcl50.bpi vclx50.bpi vcljpg50.bpi bcbsmp50.bpi qrpt50.bpi vcldb50.bpi
+ vclbde50.bpi ibsmp50.bpi vcldbx50.bpi teeui50.bpi teedb50.bpi tee50.bpi
+ nmfast50.bpi dclocx50.bpi"/>
+ <PATHCPP value=".;"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+ <RELEASELIBPATH value="$(BCB)\lib\release"/>
+ <LINKER value="ilink32"/>
+ <USERDEFINES value="VCL"/>
+ <SYSDEFINES value="NO_STRICT"/>
+ <MAINSOURCE value="InstallMgr.cpp"/>
+ <INCLUDEPATH value="curl\include;..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include"/>
+ <LIBPATH value="..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib"/>
+ <WARNINGS value="-w-par -w-8027 -w-8026"/>
+ <WARNOPTSTR value=""/>
+ </MACROS>
+ <OPTIONS>
+ <IDLCFLAGS value="-I..\BibleCS -I..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr
+ -I$(BCB)\include -I$(BCB)\include\vcl -I..\..\..\..\include -src_suffix
+ cpp -DVCL -boa"/>
+ <CFLAG1 value="-O2 -H=c:\PROGRA~1\borland\CBUILD~2\lib\vcl50.csm -Hc -Vx -Ve -RT- -X- -a8
+ -b- -k- -vi -c -tW -tWM"/>
+ <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+ <RFLAGS value=""/>
+ <AFLAGS value="/mx /w2 /zn"/>
+ <LFLAGS value="-D&quot;&quot; -aa -Tpe -x -Gn"/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
+ <ALLRES value="$(RESFILES)"/>
+ <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=0
+MajorVer=1
+MinorVer=5
+Release=3
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=CrossWire Bible Society
+FileDescription=SWORD Installation Manager
+FileVersion=1.5.3.0
+InternalName=InstallMgr
+LegalCopyright=Copyright 2002 by CrossWire Bible Society
+LegalTrademarks=
+OriginalFilename=
+ProductName=The SWORD Project
+ProductVersion=1.5.3
+Comments=Seek Jesus who exchanges temporary for eternal
+
+[HistoryLists\hlIncludePath]
+Count=6
+Item0=curl\include;..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item1=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item2=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item3=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item4=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item5=..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+
+[HistoryLists\hlLibraryPath]
+Count=5
+Item0=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib
+Item1=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib
+Item2=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib
+Item3=..\BibleCS;..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib
+Item4=..\..\..\..\usr\src\sword\apps\windoze\CBuilder4\InstallMgr;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=8
+Item0=VCL
+Item1=VCL;__STDC__ true
+Item2=VCL;__STDC__
+Item3=VCL;_MSC_VER
+Item4=VCL __STDC__
+Item5=VCL;_DEBUG
+Item6=_DEBUG;VCL
+Item7=_DEBUG
+
+[HistoryLists\hlRunParameters]
+Count=1
+Item0=-uninstall
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+ </IDEOPTIONS>
+</PROJECT> \ No newline at end of file
diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp
new file mode 100644
index 0000000..a269603
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.cpp
@@ -0,0 +1,36 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+USERES("InstallMgr.res");
+USEFORM("MainFrm.cpp", MainForm);
+USEFORM("StatusFrm.cpp", StatusForm);
+USEFORM("RemoteMntFrm.cpp", RemoteMntForm);
+USEFORM("InfoFrm.cpp", InfoForm);
+USEFORM("cipherfrm.cpp", CipherForm);
+USEFORM("UninstallFrm.cpp", UninstallForm);
+USELIB("zlib.lib");
+USELIB("..\..\..\..\lib\swordlib.lib");
+USELIB("libcurl.lib");
+USELIB("curl\lib\ws2_32.lib");
+//---------------------------------------------------------------------------
+WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+ try
+ {
+ Application->Initialize();
+ Application->Title = "Install Manager";
+ Application->CreateForm(__classid(TMainForm), &MainForm);
+ Application->CreateForm(__classid(TStatusForm), &StatusForm);
+ Application->CreateForm(__classid(TRemoteMntForm), &RemoteMntForm);
+ Application->CreateForm(__classid(TInfoForm), &InfoForm);
+ Application->CreateForm(__classid(TCipherForm), &CipherForm);
+ Application->CreateForm(__classid(TUninstallForm), &UninstallForm);
+ Application->Run();
+ }
+ catch (Exception &exception)
+ {
+ Application->ShowException(&exception);
+ }
+ return 0;
+}
+//---------------------------------------------------------------------------
diff --git a/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res
new file mode 100644
index 0000000..67f5484
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/InstallMgr.res
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp
new file mode 100644
index 0000000..42e0500
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.cpp
@@ -0,0 +1,1110 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+extern "C" {
+#include <untgz.h>
+}
+
+#include "MainFrm.h"
+#include "StatusFrm.h"
+#include "RemoteMntFrm.h"
+#include "InfoFrm.h"
+#include "cipherfrm.h"
+#include "UninstallFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+#include <swwinlog.h>
+#include <shellapi.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <io.h>
+#include <sys/stat.h>
+#include <dir.h>
+#include <FileCtrl.hpp>
+
+TMainForm *MainForm;
+
+
+VersionInfo::VersionInfo(const char *version) {
+ char *buf = new char[ strlen(version) + 1 ];
+ char *tok;
+ major = minor = minor2 = minor3 = 0;
+
+ strcpy(buf, version);
+ tok = strtok(buf, ".");
+ if (tok)
+ major = atoi(tok);
+ tok = strtok(0, ".");
+ if (tok)
+ minor = atoi(tok);
+ tok = strtok(0, ".");
+ if (tok)
+ minor2 = atoi(tok);
+ tok = strtok(0, ".");
+ if (tok)
+ minor3 = atoi(tok);
+ delete [] buf;
+}
+
+
+int VersionInfo::compare(const VersionInfo &vi) const {
+ if (major == vi.major)
+ if (minor == vi.minor)
+ if (minor2 == vi.minor2)
+ if (minor3 == vi.minor3)
+ return 0;
+ else return minor3 - vi.minor3;
+ else return minor2 - vi.minor2;
+ else return minor - vi.minor;
+ else return major - vi.major;
+}
+
+
+__fastcall InstallSourceTab::InstallSourceTab(TComponent *Owner, const char *confEnt, const char *type) : TControl(Owner) {
+ char *buf = new char [ strlen(confEnt) + 1 ];
+
+ strcpy(buf, confEnt);
+
+ Caption = strtok(buf, "|");
+ Source = strtok(0, "|");
+ Directory = strtok(0, "|");
+ delete [] buf;
+ Type = type;
+ mgr = 0;
+}
+
+__fastcall InstallSourceTab::~InstallSourceTab() {
+ if (mgr)
+ delete mgr;
+}
+
+__fastcall TMainForm::TMainForm(TComponent* Owner)
+ : TForm(Owner)
+{
+ try {
+ manager = new SWMgr();
+ }
+ catch (...) {
+ createPathAndFile("./mods.d/globals.conf");
+ manager = new SWMgr();
+ }
+ installConf = new SWConfig("./InstallMgr.conf");
+ localMgr = 0;
+}
+
+
+__fastcall TMainForm::~TMainForm()
+{
+ delete manager;
+ delete installConf;
+ if (localMgr)
+ delete localMgr;
+}
+
+
+void __fastcall TMainForm::FormCreate(TObject *Sender) {
+
+ refreshPageControl();
+
+ if (SWLog::systemlog)
+ delete SWLog::systemlog;
+ SWLog::systemlog = new SWWinLog(this->Handle); // set the system logger to our MSWindows specific SWLog class
+
+ fillInstallTree();
+ fillSourceTree(getLocalDir(), localTree);
+}
+
+
+void TMainForm::refreshPageControl() {
+ SectionMap::iterator sources;
+ ConfigEntMap::iterator sourceBegin;
+ ConfigEntMap::iterator sourceEnd;
+
+ while (PageControl1->PageCount > 1) {
+ delete PageControl1->Pages[1];
+ }
+
+ sources = installConf->Sections.find("Sources");
+ passive = (!stricmp((*installConf)["General"]["PassiveFTP"].c_str(), "true"));
+
+ if (sources != installConf->Sections.end()) {
+ sourceBegin = sources->second.lower_bound("FTPSource");
+ sourceEnd = sources->second.upper_bound("FTPSource");
+
+ if (sourceBegin != sourceEnd) {
+ while (sourceBegin != sourceEnd) {
+ InstallSourceTab *ist = new InstallSourceTab(this, sourceBegin->second.c_str(), "FTP");
+ addSource(ist);
+ sourceBegin++;
+ }
+ }
+ }
+}
+
+
+void TMainForm::addSource(InstallSourceTab *ist)
+{
+ TTabSheet *newtab = new TTabSheet(this);
+ TTreeView *newtree = new TTreeView(this);
+ TSpeedButton *newbutton = new TSpeedButton(this);
+ TPanel *newpanel = new TPanel(this);
+ char buf[512];
+ SectionMap::iterator sit;
+
+ newtab->Caption = ist->Caption.c_str();
+ newtab->Hint = ist->Source.c_str();
+ newtab->ShowHint = true;
+ newtab->PageControl = PageControl1;
+ ist->Parent = newtab;
+ ist->tree = newtree;
+ newpanel->Parent = newtab;
+ newpanel->Align = alTop;
+ newpanel->BevelOuter = bvNone;
+ newpanel->BevelInner = bvNone;
+ newpanel->Height = 25;
+ newbutton->Parent = newpanel;
+ newbutton->Caption = "Refresh from Remote Source";
+ newbutton->Width = 210;
+ newbutton->OnClick = RefreshRemoteSource;
+ newbutton->Flat = true;
+ newbutton->Glyph = SpeedButton2->Glyph;
+ newtree->Parent = newtab;
+ newtree->Align = alClient;
+ newtree->ReadOnly = true;
+ newtree->OnDblClick = localTreeDblClick;
+ newtree->Images = ImageList1;
+ newtree->StateImages = ImageList2;
+ string parent = "./sources/" + ist->Source + "/file";
+ createParent(parent.c_str());
+ parent = "./sources/" + ist->Source;
+ fillSourceTree(parent.c_str(), newtree);
+}
+
+
+const char *TMainForm::getLocalDir()
+{
+ ConfigEntMap::iterator entry;
+
+ entry = installConf->Sections["Sources"].find("LocalPath");
+ if (entry == installConf->Sections["Sources"].end()) {
+ installConf->Sections["Sources"].insert(ConfigEntMap::value_type("LocalPath", "d:/sword"));
+ entry = installConf->Sections["Sources"].find("LocalPath");
+ }
+ return entry->second.c_str();
+
+}
+
+
+void TMainForm::setLocalDir(const char *idir)
+{
+ installConf->Sections["Sources"].erase("LocalPath"); installConf->Sections["Sources"].insert(ConfigEntMap::value_type("LocalPath", idir));
+}
+
+
+//---------------------------------------------------------------------------
+void __fastcall TMainForm::LocalPath1Click(TObject *Sender)
+{
+ AnsiString Dir = "C:";
+ WideString Root = getLocalDir();
+ SelectDirectory("Select Local Path", Root , Dir);
+
+/*
+ localPathDlg->Title = "Select a file in the directory to choose";
+ localPathDlg->InitialDir = getLocalDir();
+ if (localPathDlg->Execute()) {
+ char *buf = new char [ strlen(localPathDlg->FileName.c_str()) + 1 ];
+
+ strcpy(buf, localPathDlg->FileName.c_str());
+ int end = strlen(buf) - 1;
+ while (end) {
+ if ((buf[end] == '/') || (buf[end] == '\\'))
+ break;
+ end--;
+ }
+ buf[end+1] = 0;
+ setLocalDir(buf);
+ delete [] buf;
+ }
+*/
+
+ setLocalDir(Dir.c_str());
+
+ installConf->Save();
+ fillSourceTree(getLocalDir(), localTree);
+}
+//---------------------------------------------------------------------------
+
+void TMainForm::fillInstallTree()
+{
+ ModMap::iterator mods;
+ TTreeNode *node;
+ string nodeName;
+
+ installTree->Items->Clear();
+
+ if (!manager->configPath)
+ return;
+
+ for (mods = manager->Modules.begin(); mods != manager->Modules.end(); mods++) {
+ for (node = installTree->Items->GetFirstNode(); node; node = node->getNextSibling()) {
+ if (!strcmp(node->Text.c_str(), mods->second->Type())) {
+ break;
+ }
+ }
+ if (!node) { // Add Section
+ if (!strncmp(mods->second->Type(), "Bibl", 4)) // If Bibles, put first in list
+ node = installTree->Items->AddChildFirst(0, mods->second->Type());
+ else node = installTree->Items->AddChild(0, mods->second->Type());
+ }
+ nodeName = "[";
+ nodeName += mods->second->Name();
+ nodeName += "] ";
+ nodeName += mods->second->Description();
+ node = installTree->Items->AddChildObject(node, nodeName.c_str(), mods->second->Name());
+ }
+ for (node = installTree->Items->GetFirstNode(); node; node = node->getNextSibling())
+ node->Expand(true);
+ node = installTree->Items->GetFirstNode();
+ if (node)
+ node->MakeVisible();
+}
+
+
+void TMainForm::fillSourceTree(const char *sourceConf, TTreeView *tree)
+{
+ ModMap::iterator mods;
+ TTreeNode *node;
+ SectionMap::iterator sections, targetSection;
+ ConfigEntMap::iterator entry;
+ string secName;
+ const char * modDesc;
+ string nodeName;
+ string targetVersion;
+ string sourceVersion;
+ bool cipher;
+ bool showLocked = LockedModules1->Checked;
+
+ SWMgr *mgr;
+
+ if (tree == localTree) {
+ if (localMgr)
+ delete localMgr;
+ mgr = localMgr = new SWMgr(sourceConf);
+ }
+ else {
+
+ InstallSourceTab *ist = (InstallSourceTab *) tree->Parent->Controls[0];
+ if (ist->mgr)
+ delete ist->mgr;
+ mgr = ist->mgr = new SWMgr(sourceConf);
+ }
+
+ tree->Items->Clear();
+
+ if (!mgr->configPath)
+ return;
+
+ for (sections = mgr->config->Sections.begin(); sections != mgr->config->Sections.end(); sections++) {
+
+ cipher = false;
+
+ if (!strcmp(sections->first.c_str(), "Globals")) // skip [Globals]
+ continue;
+
+ entry = sections->second.find("CipherKey");
+ if (entry != sections->second.end()) {
+ if (showLocked)
+ cipher = true;
+ else continue;
+ }
+
+ mods = mgr->Modules.find(sections->first.c_str());
+ if (mods != mgr->Modules.end())
+ secName = mods->second->Type();
+ else {
+ secName = "Other";
+ }
+
+ string misc1 = ((entry = sections->second.find("Category")) != sections->second.end()) ? (*entry).second : (string)"";
+ if (misc1.length() > 0)
+ secName = misc1;
+
+ entry = sections->second.find("Description");
+ if (entry != sections->second.end())
+ modDesc = entry->second.c_str();
+ else modDesc = "";
+
+
+ targetVersion = "0.0";
+ sourceVersion = "1.0";
+
+ entry = sections->second.find("Version");
+ if (entry != sections->second.end())
+ sourceVersion = entry->second.c_str();
+
+ targetSection = manager->config->Sections.find(sections->first);
+ if (targetSection != manager->config->Sections.end()) {
+ targetVersion = "1.0";
+ entry = targetSection->second.find("Version");
+ if (entry != targetSection->second.end())
+ targetVersion = entry->second;
+ }
+
+ if (VersionInfo(sourceVersion.c_str()) > VersionInfo(targetVersion.c_str())) {
+ for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling()) {
+ if (!strcmp(node->Text.c_str(), secName.c_str())) {
+ break;
+ }
+ }
+
+ if (!node) { // Add Section
+ if (!strncmp(secName.c_str(), "Bibl", 4)) // If Bibles, put first in list
+ node = tree->Items->AddChildFirst(0, secName.c_str());
+ else node = tree->Items->AddChild(0, secName.c_str());
+ node->ImageIndex = 0;
+ }
+ nodeName = "[" + sections->first + "] " + modDesc;
+ node = tree->Items->AddChildObject(node, nodeName.c_str(), (void *) sections->first.c_str());
+ if (VersionInfo(targetVersion.c_str()) < VersionInfo("1.0")) {
+ node->ImageIndex = 1;
+ node->SelectedIndex = 1;
+ }
+ else {
+ node->ImageIndex = 2;
+ node->SelectedIndex = 2;
+ }
+ if (cipher) {
+ node->ImageIndex += 2;
+ node->SelectedIndex += 2;
+ }
+ node->StateIndex = 0;
+ }
+ }
+ for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling())
+ node->Expand(true);
+ node = tree->Items->GetFirstNode();
+ if (node)
+ node->MakeVisible();
+}
+
+
+void __fastcall TMainForm::Button5Click(TObject *Sender)
+{
+ TTreeView *tree;
+ for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) {
+ if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) {
+ tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]);
+ break;
+ }
+ }
+ TTreeNode *node = tree->Selected;
+ if (node) {
+ if (node->Parent) {
+ if (node->StateIndex == 1)
+ node->StateIndex = 0; //node->StateIndex;
+ else node->StateIndex = 1;
+ tree->Repaint();
+ }
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::localTreeDblClick(TObject *Sender)
+{
+ Button5Click(Sender);
+}
+//---------------------------------------------------------------------------
+
+int TMainForm::selectAll(TTreeView *tree, bool sel)
+{
+ TTreeNode *node;
+ TTreeNode *node2;
+ int retCount = 0;
+
+ for (node = tree->Items->GetFirstNode(); node; node = node->getNextSibling()) {
+ for (node2 = node->getFirstChild(); node2; node2 = node2->getNextSibling()) {
+ if (node2->StateIndex == 1) {
+ if (!sel) {
+ node2->StateIndex = 0; //node2->StateIndex;
+ retCount++;
+ }
+ }
+ else {
+ if (sel) {
+ node2->StateIndex = 1;
+ retCount++;
+ }
+ }
+ }
+ }
+ return retCount;
+}
+
+
+void __fastcall TMainForm::Button6Click(TObject *Sender) // SELECT ALL
+{
+ TTreeView *tree;
+ for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) {
+ if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) {
+ tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]);
+ break;
+ }
+ }
+ if (!selectAll(tree, true))
+ selectAll(tree, false);
+ tree->Repaint();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Image1Click(TObject *Sender)
+{
+ ShellExecute(this->Handle, "open", "http://www.crosswire.org", NULL, NULL, SW_SHOWNORMAL);
+
+}
+//---------------------------------------------------------------------------
+
+int TMainForm::removeModule(const char *modName)
+{
+ SectionMap::iterator module;
+ ConfigEntMap::iterator fileBegin;
+ ConfigEntMap::iterator fileEnd, entry;
+
+ module = manager->config->Sections.find(modName);
+
+ if (module != manager->config->Sections.end()) {
+ entry = module->second.find("CipherKey");
+ if (entry != module->second.end())
+ CipherForm->cipherEdit->Text = entry->second.c_str();
+
+ fileBegin = module->second.lower_bound("File");
+ fileEnd = module->second.upper_bound("File");
+
+ if (fileBegin != fileEnd) { // remove each file
+ while (fileBegin != fileEnd) {
+ //remove file
+ remove(fileBegin->second.c_str());
+ fileBegin++;
+ }
+ }
+ else { //remove all files in DataPath directory
+
+ DIR *dir;
+ struct dirent *ent;
+ ConfigEntMap::iterator entry;
+ string modDir;
+ string modFile;
+
+ entry = module->second.find("DataPath");
+ if (entry != module->second.end()) {
+ modDir = entry->second.c_str();
+ entry = module->second.find("ModDrv");
+ if (entry != module->second.end()) {
+ if (!strcmp(entry->second.c_str(), "RawLD") || !strcmp(entry->second.c_str(), "RawLD4") || !strcmp(entry->second.c_str(), "zLD") || !strcmp(entry->second.c_str(), "RawGenBook") || !strcmp(entry->second.c_str(), "zGenBook")) {
+ char *buf = new char [ strlen(modDir.c_str()) + 1 ];
+
+ strcpy(buf, modDir.c_str());
+ int end = strlen(buf) - 1;
+ while (end) {
+ if (buf[end] == '/')
+ break;
+ end--;
+ }
+ buf[end] = 0;
+ modDir = buf;
+ delete [] buf;
+ }
+ }
+
+ if (dir = opendir(modDir.c_str())) {
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = modDir;
+ modFile += "/";
+ modFile += ent->d_name;
+ remove(modFile.c_str());
+ }
+ }
+ closedir(dir);
+ }
+ if (dir = opendir(manager->configPath)) { // find and remove .conf file
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = manager->configPath;
+ modFile += "/";
+ modFile += ent->d_name;
+ SWConfig *config = new SWConfig(modFile.c_str());
+ if (config->Sections.find(modName) != config->Sections.end()) {
+ delete config;
+ remove(modFile.c_str());
+ }
+ else delete config;
+ }
+ }
+ closedir(dir);
+ }
+ }
+ }
+ return 0;
+ }
+ return 1;
+}
+
+
+int TMainForm::createParent(const char *pName)
+{
+ char *buf = new char [ strlen(pName) + 1 ];
+ int retCode = 0;
+
+ strcpy(buf, pName);
+ int end = strlen(buf) - 1;
+ while (end) {
+ if (buf[end] == '/')
+ break;
+ end--;
+ }
+ buf[end] = 0;
+ if (strlen(buf)>0) {
+ if (access(buf, 02)) { // not exists with write access?
+ if ((retCode = mkdir(buf))) {
+ createParent(buf);
+ retCode = mkdir(buf);
+ }
+ }
+ }
+ else retCode = -1;
+ delete [] buf;
+ return retCode;
+}
+
+
+int TMainForm::createPathAndFile(const char *fName)
+{
+ int fd;
+
+ fd = open(fName, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+ if (fd < 1) {
+ createParent(fName);
+ fd = open(fName, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE);
+ }
+ return fd;
+}
+
+
+int TMainForm::copyFileToCWD(const char *sourceDir, const char *fName)
+{
+ string sourcePath = sourceDir;
+ sourcePath += fName;
+
+ string dest;
+ dest = manager->prefixPath;
+ if ((manager->prefixPath[strlen(manager->prefixPath)-1] != '\\') && ( manager->prefixPath[strlen(manager->prefixPath)-1] != '/'))
+ dest += "/";
+ dest += fName;
+
+ return copyFile(sourcePath.c_str(), dest.c_str());
+}
+
+
+int TMainForm::copyFile(const char *sourceFile, const char *targetFile)
+{
+ int sfd, dfd, len;
+ char buf[4096];
+
+ if ((sfd = open(sourceFile, O_RDONLY|O_BINARY)) < 1)
+ return -1;
+ if ((dfd = createPathAndFile(targetFile)) < 1)
+ return -1;
+
+ do {
+ len = read(sfd, buf, 4096);
+ write(dfd, buf, len);
+ }
+ while(len == 4096);
+ close(dfd);
+ close(sfd);
+
+ return 0;
+}
+
+
+int TMainForm::installModule(const char *modName, InstallSourceTab *ist)
+{
+ SectionMap::iterator module, section;
+ ConfigEntMap::iterator fileBegin;
+ ConfigEntMap::iterator fileEnd;
+ ConfigEntMap::iterator entry;
+ string sourceDir;
+ string buffer;
+ bool aborted = false;
+ bool cipher = false;
+
+ if (ist)
+ sourceDir = "./sources/" + ist->Source;
+ else sourceDir = getLocalDir();
+
+ SWMgr mgr(sourceDir.c_str());
+
+ module = mgr.config->Sections.find(modName);
+
+ if (module != mgr.config->Sections.end()) {
+
+ entry = module->second.find("CipherKey");
+ if (entry != module->second.end())
+ cipher = true;
+
+ fileEnd = module->second.upper_bound("File");
+ fileBegin = module->second.lower_bound("File");
+
+ if (fileBegin != fileEnd) { // copy each file
+ if (ist) {
+ while (fileBegin != fileEnd) { // ftp each file first
+ buffer = sourceDir + "/" + fileBegin->second;
+ if (FTPCopy(ist, fileBegin->second.c_str(), buffer.c_str())) {
+ aborted = true;
+ break; // user aborted
+ }
+ fileBegin++;
+ }
+ fileBegin = module->second.lower_bound("File");
+ }
+
+ if (!aborted) {
+ // DO THE INSTALL
+ while (fileBegin != fileEnd) {
+ copyFileToCWD(sourceDir.c_str(), fileBegin->second.c_str());
+ fileBegin++;
+ }
+ }
+ //---------------
+
+ if (ist) {
+ fileBegin = module->second.lower_bound("File");
+ while (fileBegin != fileEnd) { // delete each tmp ftp file
+ buffer = sourceDir + "/" + fileBegin->second;
+ remove(buffer.c_str());
+ fileBegin++;
+ }
+ }
+ }
+ else { //copy all files in DataPath directory
+ DIR *dir;
+ struct dirent *ent;
+ ConfigEntMap::iterator entry;
+ string modDir;
+ string modFile;
+ string sourceOrig = sourceDir;
+
+ entry = module->second.find("DataPath");
+ if (entry != module->second.end()) {
+ modDir = entry->second.c_str();
+ entry = module->second.find("ModDrv");
+ if (entry != module->second.end()) {
+ if (!strcmp(entry->second.c_str(), "RawLD") || !strcmp(entry->second.c_str(), "RawLD4") || !strcmp(entry->second.c_str(), "zLD") || !strcmp(entry->second.c_str(), "RawGenBook") || !strcmp(entry->second.c_str(), "zGenBook")) {
+ char *buf = new char [ strlen(modDir.c_str()) + 1 ];
+
+ strcpy(buf, modDir.c_str());
+ int end = strlen(buf) - 1;
+ while (end) {
+ if (buf[end] == '/')
+ break;
+ end--;
+ }
+ buf[end] = 0;
+ modDir = buf;
+ delete [] buf;
+ }
+ }
+
+ if (ist) {
+ buffer = sourceDir + "/" + modDir;
+ if (FTPCopy(ist, modDir.c_str(), buffer.c_str(), true)) {
+ aborted = true; // user aborted
+ }
+ }
+ sourceDir += "/";
+ sourceDir += modDir;
+ if (!aborted) {
+ if (dir = opendir(sourceDir.c_str())) {
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = modDir;
+ modFile += "/";
+ modFile += ent->d_name;
+ copyFileToCWD(sourceOrig.c_str(), modFile.c_str());
+ }
+ }
+ closedir(dir);
+ }
+ }
+ if (ist) { // delete tmp ftp files
+ if (dir = opendir(sourceDir.c_str())) {
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = sourceOrig + "/" + modDir;
+ modFile += "/";
+ modFile += ent->d_name;
+ remove(modFile.c_str());
+ }
+ }
+ closedir(dir);
+ }
+ }
+ sourceDir = sourceOrig;
+ sourceDir += "/mods.d/";
+ if (!aborted) {
+ if (dir = opendir(sourceDir.c_str())) { // find and copy .conf file
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = sourceDir;
+ modFile += ent->d_name;
+ SWConfig *config = new SWConfig(modFile.c_str());
+ if (config->Sections.find(modName) != config->Sections.end()) {
+ delete config;
+ string targetFile = manager->configPath; //"./mods.d/";
+ targetFile += "/";
+ targetFile += ent->d_name;
+ copyFile(modFile.c_str(), targetFile.c_str());
+ if (cipher) {
+ CipherForm->modName = modName;
+ CipherForm->confFile = targetFile;
+ if (CipherForm->ShowModal() == mrCancel) {
+ removeModule(modName);
+ aborted = true;
+ }
+ }
+ }
+ else delete config;
+ }
+ }
+ closedir(dir);
+ }
+ }
+ }
+ }
+ return (aborted) ? -1 : 0;
+ }
+ return 1;
+}
+
+
+void TMainForm::fillAllSourceTrees()
+{
+ fillSourceTree(getLocalDir(), localTree);
+ for (int i = 1; i < PageControl1->PageCount; i++) {
+ InstallSourceTab *ist = (InstallSourceTab *) MainForm->PageControl1->Pages[i]->Controls[0];
+ string parent = "./sources/" + ist->Source;
+ fillSourceTree(parent.c_str(), ist->tree);
+ }
+}
+
+
+void __fastcall TMainForm::Button4Click(TObject *Sender) // REMOVE MODULE
+{
+ TTreeNode *node = installTree->Selected;
+ if (node) {
+ if (node->Parent) {
+ removeModule((const char *)node->Data);
+ delete manager;
+ manager = new SWMgr();
+ fillInstallTree();
+ fillAllSourceTrees();
+ }
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Button2Click(TObject *Sender) // INSTALL
+{
+ TTreeNode *node;
+ int count = 0;
+ int abort = 0;
+
+ class TWaitCursor {
+ public:
+ TWaitCursor() : oldc(Screen->Cursor) { Screen->Cursor = crHourGlass; }
+ ~TWaitCursor() { Screen->Cursor = oldc; }
+ private:
+ TCursor oldc;
+ } wait; // show hourglass
+
+ TTreeView *tree;
+ for (int i = 0; i < PageControl1->ActivePage->ControlCount; i++) {
+ if (PageControl1->ActivePage->Controls[i]->ClassNameIs("TTreeView")) {
+ tree = (TTreeView*)(PageControl1->ActivePage->Controls[i]);
+ break;
+ }
+ }
+
+ for (node = tree->Items->GetFirstNode(); node; node = node->GetNext()) {
+ if (node->StateIndex == 1)
+ count++;
+ } // do true progress bar
+
+ if (!count) {
+ MessageBox(this->WindowHandle, "Please first choose which modules you would like to install by double-clicking a module in the 'Available' tree.", "Please select modules first.", MB_OK);
+ return; // if nothing is selected, do nothing
+ }
+
+ progressBar->Max = count;
+ progressBar->Position = 0;
+
+ for (node = tree->Items->GetFirstNode(); node; node = node->GetNext()) {
+ if (node->StateIndex == 1) { // if selected for install
+ CipherForm->cipherEdit->Text = "";
+ if ((node->ImageIndex == 2) || (node->ImageIndex == 4)) { // if this is an upgrade
+ removeModule((const char *)node->Data);
+ }
+ // install module
+ statusBar->Caption = "Installing: " + node->Text + "...";
+ statusBar->Repaint();
+ if (tree == localTree)
+ abort = installModule((const char *)node->Data);
+ else abort = installModule((const char *)node->Data, (InstallSourceTab *) PageControl1->ActivePage->Controls[0]);
+ if (abort)
+ break;
+ progressBar->Position++;
+ }
+ }
+ delete manager;
+ manager = new SWMgr();
+ fillInstallTree();
+ fillAllSourceTrees();
+ statusBar->Caption = "";
+ progressBar->Position = 0;
+}
+
+
+int TMainForm::FTPCopy(InstallSourceTab *ist, const char *src, const char *dest, bool dirTransfer, const char *suffix)
+{
+ StatusForm->ist = ist;
+ StatusForm->src = src;
+ StatusForm->dest = dest;
+ StatusForm->suffix = suffix;
+ StatusForm->dirTransfer = dirTransfer;
+ StatusForm->passive = passive;
+ Application->ProcessMessages();
+ if (StatusForm->ShowModal() == mrCancel)
+ return -1;
+ else return 0;
+}
+
+
+void __fastcall TMainForm::RefreshRemoteSource(TObject *Sender)
+{
+ InstallSourceTab *ist = (InstallSourceTab *) MainForm->PageControl1->ActivePage->Controls[0];
+ DIR *dir;
+ struct dirent *ent;
+ ConfigEntMap::iterator entry;
+ string modDir;
+ string modFile;
+ string root = "./sources/";
+ root += ist->Source.c_str();
+ string target = root + "/mods.d";
+
+ if (dir = opendir(target.c_str())) {
+ rewinddir(dir);
+ while ((ent = readdir(dir))) {
+ if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) {
+ modFile = target;
+ modFile += "/";
+ modFile += ent->d_name;
+ remove(modFile.c_str());
+ }
+ }
+ closedir(dir);
+ }
+
+
+ string archive = root + "/mods.d.tar.gz";
+ if (!FTPCopy(ist, "mods.d.tar.gz", archive.c_str(), false)) {
+ int fd = open(archive.c_str(), O_RDONLY|O_BINARY);
+ untargz(fd, root.c_str());
+ close(fd);
+ }
+ else FTPCopy(ist, "mods.d", target.c_str(), true, ".conf");
+
+ target = "./sources/";
+ target += ist->Source.c_str();
+
+ fillSourceTree(target.c_str(), ist->tree);
+}
+
+
+
+void __fastcall TMainForm::SpeedButton1Click(TObject *Sender)
+{
+ InfoForm->Caption = "W A R N I N G";
+ InfoForm->info = "\\qc {\\b \\fs20 -=+* WARNING *+=- -=+* WARNING *+=-}\\par\\par\\pard ";
+ InfoForm->info += "Although Install Manager provides a convenient way for installing and upgrading SWORD components, it also uses a systematic method for accessing sites which gives packet sniffers a target to lock into for singling out users. \\par\\par ";
+ InfoForm->info += "\\b\\qc IF YOU LIVE IN A PERSECUTED COUNTRY AND DO NOT WISH TO RISK DETECTION, YOU SHOULD *NOT* USE INSTALL MANAGER'S REMOTE SOURCE FEATURES.";
+ InfoForm->ShowModal();
+ if (RemoteMntForm->ShowModal() == mrOk) {
+ delete installConf;
+ installConf = new SWConfig("./InstallMgr.conf");
+
+ refreshPageControl();
+ }
+}
+
+void __fastcall TMainForm::SpeedButton5Click(TObject *Sender)
+{
+ TTreeView *tree;
+ InstallSourceTab *ist = 0;
+ SectionMap::iterator module;
+ ConfigEntMap::iterator entry, entryEnd;
+ string sourceDir;
+
+ if (PageControl1->ActivePage != PageControl1->Pages[0]) {
+ ist = (InstallSourceTab *) PageControl1->ActivePage->Controls[0];
+ tree = ist->tree;
+ }
+ else tree = localTree;
+
+ TTreeNode *node = tree->Selected;
+ if (node) {
+ if (node->Parent) {
+ if (ist)
+ sourceDir = "./sources/" + ist->Source;
+ else sourceDir = getLocalDir();
+ SWMgr *mgr = new SWMgr(sourceDir.c_str());
+
+ module = mgr->config->Sections.find((const char *)node->Data);
+
+ if (module != mgr->config->Sections.end()) {
+ string targetVersion = "0.0";
+ string sourceVersion = "1.0";
+ SectionMap::iterator targetSection;
+
+ entry = module->second.find("Version");
+ if (entry != module->second.end())
+ sourceVersion = entry->second.c_str();
+
+ targetSection = manager->config->Sections.find(module->first);
+ if (targetSection != manager->config->Sections.end()) {
+ targetVersion = "1.0";
+ entry = targetSection->second.find("Version");
+ if (entry != targetSection->second.end())
+ targetVersion = entry->second;
+ }
+ if (VersionInfo(targetVersion.c_str()) < VersionInfo("1.0")) {
+ InfoForm->info = "\\pard{\\b * Additional Module Available for Install. } \\par ";
+ }
+ else {
+ InfoForm->info = "\\pard{\\b + Upgraded Module Available for Install.}\\par\\tab Current Version: \\tab " + targetVersion + " \\par\\tab Upgrade Version:\\tab " + sourceVersion + " \\par ";
+ bool changes = false;
+ for (entry = module->second.begin(); entry != module->second.end(); entry++) {
+ if (!strncmp(entry->first.c_str(), "History_", 8)) {
+ if (VersionInfo(&entry->first.c_str()[8]) > VersionInfo(targetVersion.c_str())) {
+ if (!changes) {
+ changes = true;
+ InfoForm->info += "\\par{\\b Changes: }\\par ";
+ }
+ InfoForm->info += "\\tab ";
+ InfoForm->info += entry->second.c_str();
+ InfoForm->info += "\\par ";
+ }
+ }
+ }
+ }
+
+ entry = module->second.find("About");
+ if (entry != module->second.end()) {
+ InfoForm->info += "\\par{\\b About: } \\par\\par ";
+ InfoForm->info += entry->second.c_str();
+ }
+ InfoForm->Caption = "Module Information";
+ InfoForm->ShowModal();
+ }
+ delete mgr;
+ }
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Exit1Click(TObject *Sender)
+{
+ Close();
+}
+//---------------------------------------------------------------------------
+
+
+void TMainForm::deleteAllModules() {
+
+ SWMgr *mgr = new SWMgr();
+
+
+ int count = mgr->Modules.size();
+
+ if (!count)
+ return;
+
+ UninstallForm->Show();
+ UninstallForm->ProgressBar1->Max = count;
+ UninstallForm->ProgressBar1->Position = 0;
+
+ ModMap::iterator it;
+ for (it = mgr->Modules.begin(); it != mgr->Modules.end(); it++) {
+ string label = "Uninstalling: [";
+ label += it->second->Name();
+ label += "] ";
+ label += it->second->Description();
+ UninstallForm->Label1->Caption = label.c_str();
+ UninstallForm->Label1->Repaint();
+ removeModule(it->second->Name());
+ UninstallForm->ProgressBar1->Position = UninstallForm->ProgressBar1->Position + 1;
+ UninstallForm->ProgressBar1->Repaint();
+ }
+ delete mgr;
+ UninstallForm->Hide();
+ return;
+}
+void __fastcall TMainForm::FormShow(TObject *Sender)
+{
+ for (int i=0;i<=ParamCount();i++) {
+ if (LowerCase(ParamStr(i)) == "-uninstall") {
+ deleteAllModules();
+ Application->Terminate();
+ }
+ }
+
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::LockedModules1Click(TObject *Sender) {
+ LockedModules1->Checked = !(LockedModules1->Checked);
+
+ if (LockedModules1->Checked) {
+ InfoForm->Caption = "About Locked Modules";
+ InfoForm->info = "\\qc {\\b \\fs20 About Locked Modules}\\par\\par\\pard ";
+
+ InfoForm->info += "Unfortunately, we are unable to legally provide these modules to the general public at this time. We are making attempts to gain permission from the copyright holders, but until such an agreement is arranged, these modules are only available to our developers and testers. We hope to be able to provide some of these to you soon. \\par\\par\\pard ";
+ InfoForm->info += "If you would like to contribute to the project by contacting a publisher seeking distribution permission for CrossWire, your efforts would be very appreciated-- especially in regard to non-English texts. Please subscribe to our developers' forum per instructions on our website, following the [Mailing Lists] link, and post a message stating how you would like to help. Thank you. \\par\\par\\pard ";
+ InfoForm->info += "\t-CrossWire Bible Society. ";
+ InfoForm->ShowModal();
+ }
+ fillAllSourceTrees();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TMainForm::Contents1Click(TObject *Sender)
+{
+ SWConfig optionsconf("options.conf");
+ string helpDir;
+ ConfigEntMap::iterator it = optionsconf.Sections["Help"].find("Directory");
+ if (it != optionsconf.Sections["Help"].end())
+ helpDir = (*it).second;
+ else helpDir = ".\\help";
+
+ string helpExe = helpDir + "\\Sword.chm::modulesh.html#instmgr";
+ ShellExecute(this->Handle, "open", "hh", helpExe.c_str(), NULL, SW_SHOWNORMAL);
+}
+//---------------------------------------------------------------------------
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm
new file mode 100644
index 0000000..97c9de9
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.dfm
@@ -0,0 +1,2224 @@
+object MainForm: TMainForm
+ Left = 361
+ Top = 228
+ Width = 597
+ Height = 475
+ Caption = 'Install Manager'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ Menu = MainMenu1
+ OldCreateOrder = False
+ Position = poScreenCenter
+ Scaled = False
+ OnCreate = FormCreate
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter1: TSplitter
+ Left = 281
+ Top = 81
+ Width = 3
+ Height = 326
+ Cursor = crHSplit
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 589
+ Height = 81
+ Align = alTop
+ AutoSize = True
+ BorderStyle = bsSingle
+ TabOrder = 0
+ object Image1: TImage
+ Left = 1
+ Top = 1
+ Width = 583
+ Height = 75
+ Hint = 'http://www.crosswire.org'
+ Align = alClient
+ AutoSize = True
+ Center = True
+ ParentShowHint = False
+ Picture.Data = {
+ 07544269746D6170E69A0000424DE69A0000000000003600000028000000AF00
+ 00004B0000000100180000000000B09A0000120B0000120B0000000000000000
+ 0000403B3B817E7E8077768177777D74738076767D73737C7271766C6C796F6F
+ 746B6A726867756B6A736969726867756A6A726868776C6C736868726767766B
+ 6B736968716766766C6B746968726867746A69736968746A6A726767766B6A72
+ 6766726767716665726766736868746868716665706564766B6A766A6A796C6C
+ 776B6A776B6B766A69786B6A776A69766968766868766968776A697367667669
+ 69776969776A6A766A69786B6A756767776968776969786A6977696879696977
+ 6867776867776867796A69796969796A69776767766666756564726161776666
+ 7867667866667968677767667766657968677765647563627462617665647866
+ 647764637766657464637A68677A68677866657A69687A6A6976676675646375
+ 6463766463776564746261756463746463776766756463736261756564756362
+ 7665647666657565647464637766657767667667667768677565647968687969
+ 687C6D6C796A6A7567667567667769687A6C6B796B6A76686875686773666677
+ 6B6A786C6B7A6D6D756969756969766A6A756A69746968726666776C6C786D6D
+ 786E6D766B6B776C6C766C6C736968746B6A786E6E776D6D756B6B786E6E7A70
+ 6F7A6F6F796F6E796F6E766C6C786F6F776D6D756B6A7B7170786E6E776D6D7B
+ 7271766D6C7A7070786F6F786E6E7C72727A7170776D6D756C6C776F6F78706F
+ 736B6A776E6E756D6D8077763A3535000000817776FFF9F7F0DCDAFEEAE8FDE8
+ E7FFEEEDF9E4E3FFECEAF2DDDCFCE8E7F9E4E3F5E1E0F7E2E1F9E4E3FAE5E4FC
+ E6E5F7E1E0F7E1E0FCE6E5F9E4E2FAE4E3F9E3E2F9E2E1FFE8E7FEE7E6F9E2E0
+ FBE4E3FDE8E6FCE7E6F9E3E2FAE3E2FBE4E3F5DEDCF3DBDAF9E2E0FDE5E3FDE4
+ E4FCE2E2F7DEDDFAE0DEF6DDDBFDE3E2FFE6E5FFE7E6FFE4E3FFE6E4FFE7E5FF
+ E5E4FFE5E4F5D8D7F8DCDBFFE8E7FFE9E8FFE4E3FFE2E1FDE2E0FFE5E4FBE0DF
+ FBDEDDFFE0E0FFE0DFFEDEDDF5D4D4FBDAD9FFDFDCFFE0DEFFE4E2FFE4E2FFE2
+ E1FFDFDEFEDEDCFFDEDDFAD7D6FDDAD9FFDCDBFCD7D6F7D1CFFCD8D6FFDBDAFF
+ DEDCFFD8D6FED5D3FFDBD9FFDDDBFFD9D6FFD8D7FFDEDCFCD8D6FFDDDBFCD4D2
+ F3CDCBF8D3D1FFDEDCFFDEDDFCD7D6FFDDDBFED8D6FFD8D6FFD9D6FED8D7F9D5
+ D4FFDCDBFBD7D5F8D4D3FAD7D4FCD8D6F9D6D4FCDAD8FCDAD8FCD9D7FFDFDCFF
+ E5E3FFE4E2FFE1DFFFDDDBFFE2E0FFE0DEFFE4E2FFE7E5FFE2E1FCDDDCF9DBD9
+ FEDFDDFEE0DEFEE0DEFFE2E1FFE3E2FFE7E5FEE2E0FFECEBFFEAEAFFE8E7FFE9
+ E8FFECEAFFE7E6FDE5E4FFEAEAFFE8E8FFEBEAFFE9E9FCE6E6FEEAE9FCE7E6FD
+ E8E7FFF1F0FEE8E7F8E2E1FFEBEAFFF0EEFFEAE9FFEDECFEE9E9FDE8E8FFEEEE
+ FFECEBFFEFEEFFF2F0FFEAE9F5E0DFFFEFEEF8E4E2FFECEBFFEDECFFEAE9FFF1
+ F0FFF2F1FFEFEEFFEFEEFFEFEEFFF2F1FCE9E8FFF3F2FFF1F0FFFFFF80787700
+ 00007C7272FCEFEDCBB8B7E6D3D1E8D5D4E5D3D1E3D0CFEFDBDADBC7C6E2CFCE
+ E9D6D5E3D1D0E1CECDE0CDCCE3CFCEDDC8C7DFCBCAE8D4D3E7D3D2E9D4D3EDD9
+ D8EDD8D7E5D0CFE6D1D0E2CDCCEAD5D4E3CECCE7D2D1EFDBDAEEDAD9E9D4D3F0
+ DCDBEBD6D4DEC8C7E6CFCEE4CDCCE6CFCEE3CBCBE0C8C7E5CDCCEBD3D2E8D0CF
+ E5CCCBE5CCCBE8CECDE9D0CEEBD0CFEDD3D3F1D6D5E2C7C5DFC5C4EED5D4F1D9
+ D8F0D7D6E7CBCAECD0D0EBD1D0EBD2D1F1D6D5EDD1D0EBCDCCECCFCDDCBEBDE7
+ C8C6F1D1CFF5D4D2EDCECCE5C5C3F1D1D0EFD1D0EDCECDEFCFCDECCBCAEAC9C7
+ EBCAC8ECC9C8E0BCBAEAC7C5EECBC9EAC8C6EEC9C7EDC6C4F1CBC9ECCAC9EECB
+ CAF2CCCAEECAC8E7C4C2F2CCCBECC5C3E9C5C2DEBAB8EBC9C7F2D2D0E9C6C4EE
+ CAC8EECAC8ECC6C4EEC8C7ECC9C8E7C6C4ECCBC9E9C7C5E8C7C5E8C6C4EBC9C8
+ E4C4C3E3C3C2E3C2C0E9C6C5E8C8C5ECCDCBEECDCBF0D0CEEDCECCEECECCE8CA
+ C9E3C5C3EFD1D0F1D4D3ECD0CEEACECDEFD3D2F0D4D2F3D8D6ECD0CFEAD0CEEC
+ D0CFE5CBC8F2D9D7E9D0CFECD3D1F1D9D8F2DADAECD4D4EAD3D3E7D1D0ECD6D6
+ E9D5D5EBD8D8ECDADAEEDDDCF0DDDCE8D3D3EDD8D7F1DCDBF0DADAE3CDCDEBD7
+ D6E9D5D5ECDAD9EEDDDCE6D5D5E7D6D6E7D5D4EDD9D9E8D4D3EFDBDAE6D2D0ED
+ D9D8E6D3D2E4D0CFF2DDDBEFDCDBF3E1E0F5E3E2ECDAD9F0DEDDF2E0DFF5E3E1
+ EBD9D8F2E0DFE9D8D7FEF1F07971700000007D7372FFF3F1CDBAB9ECD8D7DECC
+ CBDCC9C8E7D3D1F3DFDED0BDBCDDCAC9E3D0CFD6C2C1E3D0CFE4D0CFD7C3C2DA
+ C6C5DBC6C5E3CFCED8C4C4D6C2C1E7D3D2E7D3D1DCC7C7DFCACAD7C2C1E5CFCE
+ D5C0BFE5D0CFEDD9D8EFDAD9EDD8D7EED9D8F0DBDAEAD4D3DCC6C4DDC7C6DAC3
+ C2DAC1C1D9C1C0DBC2C1E4CBCAD9C1BFDDC4C3DABFBEDFC5C4DFC6C4DAC0C0E2
+ C9C9DFC6C5E3C9C8DEC4C3E2C8C6E3C9C8E9D1D0DEC5C4EACECDE0C3C2DCC2C1
+ E6CCCBE5C9C8E0C3C1EED0CFDEBEBDE9C9C8E9C7C6EDCAC8D8B8B68F7B7AD3B4
+ B2F0D1CFF8D8D6F4D1D0E3C1C0EAC7C6E7C4C3E9C6C5E2BDBCECC7C6E1BEBCE3
+ BFBDE8C2C0EBC4C1E9C1BFE9C6C4E6C2C0EAC4C2E9C3C1EBC5C3EAC4C2F4CBC8
+ E2BEBCEBC5C3F3D0CEFCDAD7EDC8C5E8C2BFEDC6C4EDC4C2F0C9C7E1BEBCE4C2
+ C0E9C6C4E9C8C6E7C4C2E3C0C0F2CFCEEDCBC9E0BEBDE1BFBDE0BFBCDBBAB8E2
+ C0BED8B7B5E9C8C6E5C4C2DDBCBBDFC0BEDDBEBDE6C8C6EFD2D0D8BCBADFC3C1
+ ECD1D0ECD1D0E8CCCBD9BDBBE3C7C5D4B8B6E2C7C5DEC3C3E0C6C5DAC2C1EBD4
+ D2E2CAC9DEC6C5E5CDCCDAC5C4DFCACAE0CDCDDFCDCDEAD8D8E9D7D7DFCBCBDF
+ CBCBDDC8C8EDD8D7E4CFCFDBC7C7DBC8C6E1CECEEDDADAECDBDBDFCECDE4D3D3
+ EAD9D8E6D3D2D0BCBBECD7D7F6E2E1E8D5D4D3C0BFD7C3C2DDCAC9F5E3E2F6E3
+ E2DECCCBDBCAC9D9C7C6E4D2D1DECCCCDDCCCCDBC9C9D8C6C5EAD7D670686700
+ 0000786F6EEFDBD9D6C3C2DCC9C8D9C6C5E1CDCDF7E4E2EDD9D8D6C2C0DAC6C5
+ E1CCCCD7C4C3E4D1D0DBC7C6DAC7C6E8D4D4DAC7C6DAC7C6E1CECDE4D0CFDDC9
+ C8DECACAE1CCCCE4D0CFE1CCCBE8D4D3D8C4C3E9D5D5E9D5D4ECD7D6E7D2D1ED
+ D7D5EBD6D4E4CECED4BEBDEDD7D6E2CBCADFC8C6DFC7C6E3CBCAE9D0D0DDC4C3
+ E7CECDE1C8C6EED4D3EBD2D0DDC4C3E0C6C6E5CBCAE2C9C7E3C9C8ECD2D0DFC4
+ C3E5CAC9E3CAC9E4CAC9E5C8C8EACCCBE0C5C4E9CFCEE5C8C7F0D1D0DDBDBBEE
+ CDCCEDCBC8E8C4C3E9C4C3A18B8AA9908EECCBC9A28C8B9C8686E3C1C0D2B3B3
+ C0A3A1F2CCCBE2BCBBECC6C5E4BFBDEEC9C8AB8F8DE6BEBBB79795D1B2B0E8C3
+ C1EAC2C0BFA09EBFA19FD5B0ADAE8E8DE2BDBBB19694C9ABA9A68E8DB4989699
+ 7F7ECAA7A59B807FA88C8BE5C1BFDDBDBB957E7DD7B7B6A08685E5C2C0B99E9C
+ AD9391C7A8A6EDCAC8EACAC8DBBBB9E9C7C5DDBCB9F2D0CEE5C4C2E6C7C5E5C6
+ C4E2C3C1F1D3D1EDD0CEDDC0BEDDC1C0EFD4D3F2D7D6DFC4C2DEC2C1F7DBD9D9
+ BDBCE5C9C8D7BDBBF1D9D7E1CAC9E5CECDE0C9C8E6CFCEE2CCCBE1CCCCE8D5D5
+ E8D6D5DECCCBEDDAD9E5D2D1DAC6C5ECD7D6DEC9C9E5D0D0DFCBCAEDD9D8E3CF
+ CEDECBCAEDDBDBE5D3D3DAC9C8E9D7D7E6D4D4EBD9D9D7C3C2F3DEDEF1DDDCDD
+ CAC9D6C2C1E9D6D4D2BFBEEBD8D7F1DFDED3C0BFEFDCDBE5D3D2DBC9C9DECCCC
+ E5D4D3D4C2C1EAD8D7F1DFDE6F67670000006A6160DFCBC9EEDBD9D4C1C0D4C1
+ C0D2BFBEDDC9C8D5C1C1E1CDCBDCC7C6D9C4C4D7C4C3D9C4C3E2CECCD9C5C4DF
+ CCCBD9C7C6DBC8C7DFCBCBE4D0D0D9C5C4E4D0CFDDC8C8DAC6C5DFCBC9E1CDCB
+ D6C2C1E8D4D4E8D5D4EDD9D8E3CFCDECD6D6EBD5D4ECD5D4DCC6C4E0C9C8DDC7
+ C6E1C9C9DDC5C4DCC4C2E2CAC8D9C1C0E0C7C5DAC1C0DEC5C4E4CAC9DDC4C3DE
+ C4C3DEC5C4E6CCCBDDC4C3DFC5C3E1C5C4E1C6C5E5CAC9E4CAC9E3C7C6E8CACA
+ DFC1C0E5C9C7E0C5C3EACBC9DBBCBBEBCAC9ECC9C7ECC9C7E3BEBCAD92909F88
+ 87A18987877473947F7E8E7878C4A6A5897372F4CCCAE3BCBBEDC5C3E7C0BEDA
+ B6B4403534BE9C9A62504F7F6B69F2CBC9EEC4C29379788B7472CCA7A57B6463
+ CAA8A5786462796564C4A5A48D7574866E6C786261977B7A816B6AA48B8A9B83
+ 827864638772717F6968D0AFADC5A8A69C84827B6766EBC7C5E1C1BEDCBAB8E5
+ C3C1DAB8B7E6C3C1DFBEBDE2C2C0E4C4C2DBBCBADEC0BEDCBEBCE5C8C6DFC3C2
+ E8CDCCF3D8D7E6CAC9DABDBBE5C9C8DBBFBEE8CECCD9C0BFECD3D3DEC6C5E6CE
+ CDDFC8C7E1CBCBE4D0CFDDCACAEBD8D8DFCCCCE1CDCCEDD9D9E7D2D1DCC7C6DE
+ CAC8D8C4C3E0CBCADCC7C6EBD8D7DECAC9E0CDCCEDDBDAE6D4D4DBCAC9E0CFCE
+ DECCCCE4D2D3DAC8C7F2E0DFF3E0DFE9D7D5D8C5C5E0CDCDDAC8C7EBD9D8EDDB
+ DBDBC9C9E1CFCFE1D0CFE1D0CFD7C6C5E6D5D4E0CFCEDFCECEECDAD9766D6D00
+ 00006D6363F4E0DFF1DEDDECD9D8DBC8C7E0CDCCF2DEDCECD9D7EFDBD9EAD5D4
+ E3CECDECD8D7E3CECDF0DBDAE5D1D0E7D4D3E7D3D3DAC6C5E1CECDE7D3D3D7C3
+ C2EDD8D7E5D2D1E1CCCBE9D4D3EAD5D5E8D3D3EAD6D6E2CECDE8D5D4E6D1D0E9
+ D4D3E9D4D4E9D3D2EAD4D2E5CECDE6D0CFE9D2D1E3CCCBE7D0CFE6CECDE3CBC9
+ E5CBCBE0C7C6E3CAC8E8CECDE9D0CFE8CECDE3C8C7EFD5D4E8CFCEE8CECDEFD3
+ D2ECD0CFEED1D0E4C8C7E2C7C6E9CECCDEBFBDEACAC8EACDCBE9CDCAEBCDCBEE
+ CCCAEECDCAF2CFCDF0CBC9CCACAA9E8887B19896907B7AE0C0BF5A4D4CC6A7A6
+ 816C6BFAD0CFEBC4C2EDC4C2F6CDCBB19493796463A28785625050B89897D0B0
+ AFFACFCDBA9A99A38786ECC2C07E6766CFADAB8F7877A68C8BCBABA9CAA8A595
+ 7A78967B7AA88A88BA9B9A665655806C6A9E8483A38986917978DCB9B7BB9E9C
+ 5C4D4CC4A5A4EFCCCAE9C6C4EBC7C5EFCCCAEAC8C6EFCDCAEAC9C7EACAC8EFCF
+ CDECCDCBEBCCCAE8CAC8EDCFCEECCFCEF0D4D3F1D4D3F0D3D2ECCFCEE9CDCBEB
+ D1CFE7CECDEAD1D0EDD3D2EAD1D0EDD5D4EAD4D3EBD6D6EDDADAE8D4D4ECD7D7
+ E7D3D2ECD7D7EED8D9F0DAD9ECD6D5E3CECDE5CFCFEAD5D4EBD6D6F1DDDCE9D6
+ D5EBD9D8F1DEDEEDDBDAE9D7D7E7D6D6E5D5D4E6D5D5E5D3D2EBDAD9E7D5D5F0
+ DEDDE6D3D2E7D5D4ECD9D8F3E1E0F4E3E2E6D5D4E7D5D5EDDCDBECDADAE9D8D7
+ EEDDDCE6D5D4EBDAD9F9E7E6786F6E000000736969FFEDECEAD7D6F3E1DFE4D2
+ D0E5D1D0F5E2E1F5E2E0F0DCDAF2DEDCE7D3D1F3DFDDE4CFCEECD7D6EDD9D8EF
+ DBDBEDD9D8DFCBCAD9C5C5DBC7C7DAC6C5EAD7D6EBD6D5E8D3D2E9D4D3E7D3D2
+ EDD8D9EED9D9E8D2D2E8D3D3E0CBCBE4CFCDE1CCCBE4CECEE8D2D1E8D1CFE9D2
+ D1EAD4D2E9D2D0EBD4D2EDD5D4EBD2D1EAD1CFEAD0CFE5CCCAEAD0CFECD1D0ED
+ D2D1EFD3D3F1D6D4E9CECDE9CECEEDD2D1EBCFCDEFD2D1EACCCBDDBFBEDEC2C0
+ E0C3C2EAC9C8EECCCAEBCDCBEBCCCAEECCCAEDCBC9F2CFCCF6D1CFAF94935C4E
+ 4DCAADAC96807FAB91909C8483A08786816C6BAB8E8DF4CAC8EBC1BEF8CBC988
+ 7170AC8E8DB19290715B5BF4C8C6A68B89F6CBC9C09F9E87706FD5AEAD796260
+ 997F7D8D7574EDCCC8B79896AA8D8B7C6564DCB3B1987E7C9C8382B899978C75
+ 74846E6CD5B1AF927B78DBB7B5846F6D8C7675AF9493EBC8C6E8C2C0EAC7C5F1
+ CECBF2CECCE9C6C4EDCBC9E8C7C5EACAC8EBCCCBF0D1D0ECCFCEEBCFCEE8CBCA
+ ECCECDE9CDCCECCFCDEED1CFEED2D0F3D9D7E6CCCBEACFCEE3C9C9E7CFCEEAD4
+ D3EED9D8EDD8D7ECD8D6ECD8D7ECD7D5ECD7D5EED8D7EFD9D8EFD8D8F1DADAEA
+ D4D4EAD5D4E2CDCCE6D1D1E9D4D4E5D2D1E6D3D3ECD9D9EAD8D8E9D8D7EADADA
+ E8D7D8E1CFD0DDCBCBEBD9D7E5D3D2EFDDDCEBD8D8EDDCDBEBDAD8EFDEDCF0DF
+ DDE7D6D4E5D4D3D9C7C7E7D6D5F0DEDEEEDDDCE3D2D1E1CECDE5D1D0766D6C00
+ 00007B7171FFEFEEEDDBD9F2DFDDEAD6D5E1CDCCF0DDDCF2DFDDECD7D6EDD9D8
+ E8D4D3EDD9D8E7D2D1E8D3D2DFCBC9E8D4D4EAD5D4E0CCCBDFCBCAE4D0CFE8D4
+ D3E9D5D5E7D2D1E8D3D2E9D5D4E6D2D2EBD7D6EED9D9ECD7D6EFDBDAEFD9D9E8
+ D1D0EDD6D5EAD4D2EBD6D4E8D2D0E8D0CFE8D0CEEAD1D0E7CECDEFD5D5ECD3D2
+ EBD3D2EED4D2EBD0CFEED3D1EFD3D3EBCFCDE7CBC9F1D5D3E8CCCBE3C7C6EDD1
+ D0EBCECDEDD0CEEFD0CEE9C9C7E9CAC8EDCFCEECCECCEBC9C6EBC9C7E6C6C3EB
+ CAC9E6C4C2EAC6C4EEC9C7D8B6B57C6867E1BFBDECCAC8E2C0BDF2CDCBE8C3C1
+ E9C2BFE0BAB8F4CAC8F4C7C5F2C5C2685655E1BAB7987D7C5A4948F0C5C2B699
+ 97D3ACAAEABFBDD3AEACEBBDBAE6B8B5E3BBB9EAC2C0F6D1CDEFC4C2D9B2B082
+ 6A68EBBEBBE9BFBCE1BBB9F1C8C5E4BDBBE4BDBAECC4C1E6C1BEE4BEBCE2BBB9
+ E7C3C0E0BEBCEFC9C6E9C4C0EFCAC7F1CDCAF3CECCECC9C7ECCAC9EDCCCBEDCC
+ CBEECFCEEED0CFEACCCBE9CBCAE9CCCAEDD0CFECCFCDF2D5D3F3D6D4EFD3D1F2
+ D5D4ECD0CFEFD4D3ECD3D2ECD6D5EBD6D5EDD7D5EBD4D2E9D2D1E5CFCFE7D1CF
+ E7D0CFEAD2D1EED7D6ECD5D4EBD5D4E9D3D2EED7D7EBD6D6EDD7D7EDD9D9EAD6
+ D6E8D5D4ECD9D8E9D7D7EBDADAECDBDBECDBDBE5D4D3E5D3D2ECDADAE6D4D3F1
+ DEDDF1DEDEF0DEDDECDAD9EDDBDAF3E0E0E9D7D6E6D5D4E2D0CFEAD9D8E3D2D1
+ E7D5D5F0DFDDE8D6D5EEDBD9746B6B0000007C7272FEEDECF1DFDEF3E1DFF0DD
+ DBEED9D8E8D5D3EAD6D5EFDBDAEFDBDAEDDAD9F2DEDDECD8D7F5E1DFEFDBD9EF
+ DCDAEFDBDAF1DCDBE1CECCE6D1D0F0DBDAEFD9D9EBD6D5E8D3D3E6D1D1E4D0D0
+ E8D3D3EBD5D6E8D3D2F0DBDBF0DADADFC8C7EDD6D5EED7D6EED8D6EBD4D3E8D1
+ D0E7CFCDEBD2D1E4CCCAEDD5D3E9D1D0E8CFCEECD3D2E7CDCBEACFCDF0D4D2ED
+ D0CFEACDCBF1D3D2EFD1D0E8CBCBEDD0CFEED1D0E2C4C2E8C9C7E6C6C4EBCAC9
+ EFCFCDEFD1CFECCDCBEDC8C6ECC9C6EFCFCDE4C2C0E2BDBBE3BEBCF4CCCAAC8F
+ 8ECDABAAE8C4C2F1CBC9EDC7C4F2CCCAF3C9C6F5CAC7F6CAC7F6C8C5D1A8A554
+ 4544ECC2BF5E4C4B9E7F7D9B7F7DE3BDBB967B79ECC1BEC9A6A3F1C2C0F5C4C1
+ F0C4C1EFC6C3F0C9C6F1C4C1F5C6C4836967D7ADAAEFC4C2ECC4C2ECC3C1EBC3
+ C0ECC2C0EAC2BFEDC5C3EAC1BFECC4C1F2CECBF2CBC9F3CDCAF2CDCAF1CAC8F6
+ D0CDF7D1CFF4CFCEF0CECBEFCDCCECCCCAF0D1D0F3D5D3EECFCEF0D1D0F0D3D1
+ F1D5D3ECCFCDEFD2D0F2D6D3E3C7C4E0C4C3E2C7C6EAD2D0E9D3D2EBD5D4ECD5
+ D4EED6D5F2DAD9F3DBDAF1DAD9F3DBD9F1D9D8EFD8D6F2DBDAF0D9D8EED7D6ED
+ D6D5F1DBDAEBD5D4F1DBDAF3DFDFEAD7D7EBD7D7EFDCDCE8D6D6E9D7D8ECDADB
+ EBDBDBE7D5D4E7D5D4EBD9D8E7D4D3EEDCDBEEDCDBF1DFDEEEDCDBF0DEDEF2E0
+ DFEDDCDBF2E0E0F1DFDEF3E2E1E7D5D4F2DFDEF9E5E4F8E5E4FFEFEE766D6C00
+ 0000766C6BF8E4E3F4E0DFF3DFDEE2CFCDE5D1CFDFCBC9DBC7C7E4D0CFF2DFDE
+ E5D1D0EDDAD9E1CECDE7D3D1E5D0CFE2CFCEEAD6D4EAD6D5DAC5C5DBC7C6E6D2
+ D1E8D3D2F0DAD9E4CFCFECD7D7E1CCCDE3CECEEDD9D8E5D0D0E2CDCCECD6D5D9
+ C2C2E6CFCDE7CFCEE8D1D1EDD5D4E2CCCBEAD2D1E6CDCCDFC7C6E2CAC9E2CAC9
+ E8CFCEE5CCCAECD3D1E4C9C7E9CDCBF2D6D4ECD0CFE5C8C6EACDCBEBCDCCE1C3
+ C2E6C8C6DEBFBDE6C8C6E3C4C2DEBDBBE8C6C4E4C2C0EAC9C7EAC9C7E5C0BEEF
+ CBC9E9C8C6E7C3C1DEB8B5E7C0BDE9C2BF9B7F7EC5A2A0F0CAC8E5BDBBEEC6C4
+ E9BFBCE4B8B5E7B9B6EDBEBBB58F8D8C6F6DDAB2AF8A6E6CBE9492997876DBB4
+ B2987A79CFA7A4F3C4C2EFBDBAF5C3C0ECBFBCEEC5C1E8BFBCEABBB9F2C3C099
+ 7977D6ACA9F2C8C6EDC4C2ECC4C1E5BBB8E3B9B7E4BCB9E9C0BDE8BEBCE0BAB8
+ E6BFBDEDC6C3EBC4C1E6BEBCF0C9C6E6BFBDEAC5C2E5C2BFEBC7C6EFCDCBEDCD
+ CAE3C3C2E5C4C3EBCCCAE3C3C2E7CAC9EACDCCE9CBCAE4C6C4EDCFCDEDD0CEEA
+ CFCDDDC5C4E5D0CEECD5D3ECD4D3E8D0CEE3CBCAE9D0CFEDD5D3E6CDCBE6CDCB
+ ECD3D2EDD6D4E9D1D0E6CFCEEDD5D4E7D1D0E7D1D0DFC8C8E0CBCAEED9D9E0CC
+ CCE7D4D3E8D6D6E8D5D5E3D2D1EBD9D9E5D3D3EAD7D5EDDBDAF0DEDCE2CFCEE6
+ D3D2EDDBDAE6D4D3E1CECEE3D1D0F3E1E0E4D2D2E3D1D0EBD9D9F1DFDEDBC8C7
+ E5D2D0E9D7D5EAD8D7F6E4E36F66660000007C7372FFEAE9F5E2E1D8C5C4DDC9
+ C7DECBC9DDCAC8DFCBCAD4C1BFEBD8D6D5C0BFE5D1CFDAC6C5EDD9D6E3CECCD3
+ BEBDDECBCADECBCADECBC9DCC8C7E1CCCCDAC5C4E6D1D1DEC9C9E9D4D4DDC9C9
+ E1CDCCE1CDCCE5D1D0DEC9C7ECD6D5DCC6C5E9D2D2EAD2D1EAD2D1E5CDCCD8BF
+ BEEAD2D1E3CBCADDC4C4E0C8C7DCC4C2DFC6C5E4CAC9E0C6C4DEC4C2DCC1C0E2
+ C6C4DEC1BFE3C6C4DFC1BFEACCCADBBCBAEACBC9DFC0BFE9C9C7E5C5C3E1C0BE
+ E9C6C4DAB4B2E7C2BFDEBEBCE0BFBDE2BCBAE6C2C0E0BEBCE4BEBCEBC3C1F1C8
+ C5EDC1BFDEB1AFEBC1BFE0B8B5EDC3C0E3B9B6EEC2BFDFB0ADF1C1BDE8B4B1F6
+ C1BDFACAC7FCCAC6E4B0ADF7C0BCF5C7C4F1BEBBEEBDBAE4B7B4E8B4B2E9B6B3
+ E1B2AFE3BAB7E5B9B6EABAB7F2C1BDE6B2AFE3B5B2F0C5C2F1C6C3E9BEBBE3B6
+ B4E9BEBCDFB6B3EDC1BEE2BAB7E6BFBCE1B8B5ECC3C0E6BDBADDB3B0EBC3C1E4
+ BDBBE1BBB9E6C1BFE0BDBBEFCECCF0D0CEE1C0BEE1C0BFECCDCBE1C3C2E6CAC8
+ E3C6C4E2C2C0E0C1C0E5C8C7E4CBC9DEC6C4E4CCCBE9D2D0EED6D5DDC5C4CBB4
+ B3E4CAC9DEC4C3E8CFCDDDC4C2E7CECCDEC6C4EDD5D4DAC2C1DAC3C1E5CECDDD
+ C6C5E9D3D2D8C3C3E6D2D0E1CCCCDFCBCAE1CECDDECBCBE6D3D3DECCCCEAD8D7
+ DBC7C6E7D5D4EFDCDBF1DEDCD8C4C3E4D1D0DECBCAE4D1D0DCC9C8DBC8C7EBD8
+ D7D9C6C7E1D0CEDDCACAECDADAD4C2C0ECD9D8D9C7C6E2D0D0E8D5D469606000
+ 00007D7272F4DFDEF0DEDCD0BDBBDFCBC9E0CDCCE0CDCCE0CCCBDECBCAECD8D7
+ D7C3C2E7D4D3DECBCAEBD7D6EDD9D8D4BFBDDAC5C4ECD9D8E4D0CFE0CCCCEBD7
+ D6D9C5C5DDCAC9E3CFCEE2CDCDDECAC9EAD5D4DDC8C8E1CCCBE0CBCAEBD6D5DB
+ C5C4ECD6D4F2DBDAEAD2D2DDC4C3E0C7C6E4CCCAE3CAC9E2C9C8E5CCCBDAC2C0
+ E0C6C5EFD4D3DEC3C2ECD1CFE3C8C6DEC2C0DDC1BFEED1CFDEBEBCE4C4C2DBBB
+ B9EBCCCADFBFBDE5C5C4E2C2C0E6C5C3EFCCCADCB7B5E8C2BFE1BDBBEBC9C7DE
+ BCB9DEB7B5ECC7C5EAC7C5E8C2BFEFC6C3EBC0BDDEB0AEE2B4B1E5BCB9ECC0BD
+ E1B5B2F2C5C2E1B1AEF4C2BFE2AFACEFBAB7F7C5C2F2C1BDE1ADA9EAB3AFEEBE
+ BAE5B3B0EDBBB8E8BAB7EFBAB7EAB6B3E8B8B5EBC1BEE5B7B4EEBCB9ECB7B4E0
+ AEAAE1B4B1EBBFBCF3C6C3E5B7B4E3B5B3EDC1BFE0B3B1EEC3C0DEB6B4EEC2C0
+ E6BAB7EABFBCE9BDBAE0B4B2E5BCBAE3BCB9E9C2C0EDC9C7DEBCBAF0CDCCF0CE
+ CDE4C3C2E6C7C5ECCFCDE3C7C5E5C9C7E7C8C6EDCECCE5C9C8DEC3C2DCC4C3EC
+ D3D1E8CECCE3CAC8EFD5D4C6B0B07A6C6BC6B1B0E2C8C7E3CAC8E0C7C4EED5D3
+ DDC4C2EDD3D1DFC6C5E6CDCCE9D2D1E0C9C9EFDBD9DDC9C8EAD6D6DDC8C8E7D3
+ D3E3D0CFE1CDCDEDD9D9E0CDCDECD9D8DDC9C8EAD8D7EEDAD9F0DBDAD8C4C3E8
+ D5D4DDCAC9ECD9D8E3D1D0DECBCBE1CECDDBC8C7EDDBDAD5C3C2E2D0CFD5C2C0
+ EDDBDAD9C7C5EBD9D8E9D7D66A6261000000786F6EEFDAD9E9D7D5E2CECDDCC9
+ C8DECCCBE6D4D3E4D2D1DBC9C8E4D3D2DACAC9E6D5D4DECCCCDFCDCDE1CFCEDE
+ CBCAE2CDCCDAC5C4E8D3D2DBC7C6E1CDCDE1CFCEE0CDCCE2CFCEE0CCCCDECAC9
+ E8D3D3DDC9C8E3CECEDDC8C8E2CCCBDBC4C4E7D0CFF1DAD9E5CDCCDAC3C2EAD1
+ D0E1C9C8DFC6C4DFC5C4E0C6C5E3C9C8DAC0BFE4C9C8E6CBC9DFC3C2DCC0BFF0
+ D3D1E1C5C3E1C3C2E3C4C2E2C2C0DABAB9E0C0BEDEBDBBE6C5C3DCBBB9E7C5C3
+ E7C4C2DBB7B5EDC7C6E3BEBCE3BEBCE4C1BFE7C3C0E5BBB9E0BAB7E3BFBCF3C9
+ C5E9BDBBE0B3B0EABBB8DFB1AEF2C7C3E7B9B6E8BBB8E2B0ADEAB6B3E1ADAAEE
+ B7B4F8C3C0F5C3C0E3AEAAE2A9A5E8B4B0E4B1ADEAB6B2E6B6B3E8B1AEE6B1AE
+ E5B5B1E8BDB9E3B2AEE7B3AFE5AEABE7B4B0E4B6B3E8B9B6F4C5C3EFBFBCE4B6
+ B3E6B8B5E1B2B0E7BCBAE0B3B0F1C3C1E2B7B3EABEBBE6B9B6E5B9B6F1C7C5E0
+ B9B6EDC7C5E4C0BEE9C5C3F8D4D1EDCBC9E0BFBEE2C3C2E4C7C5E3C5C4EBCCCA
+ E3C5C4ECD1D0E3CAC8EAD1CFEDD2D0EACECCE1C5C3E5C9C8EBD0CEEED3D2EBCF
+ CD948281B49F9EE4C8C7E2C7C6ECD1CFDEC3C1E2C8C6E2C9C7E5CCCBE7CFCEDF
+ C8C8E2CDCDDDC8C8EBD7D6DDC8C8E3CECDEDD8D7DECAC9DFCBCBDDC9C8E4D0CF
+ DECBCAF3DFDEF8E4E2E7D1D0D5BFBFE3CFCFE5D3D3DFCDCDDECCCBDDCBCADAC7
+ C6E1CFCFE9D7D6D8C7C6E1CECDD2C0BEE3D1D0E0CECCDECCCAE7D4D46C646300
+ 0000736968FAE6E4E5D2D0F4E0DEEEDCDBEDDCDBEEDDDBECDBDAE5D5D5E3D3D3
+ E9D9D9EBDBDBE5D4D3ECDCDBE8D6D6E6D4D4E6D2D1E3CECDE5D0CFE5D1D0E4D1
+ D0E8D5D4E9D5D5E9D6D5E0CCCCE2CECDE8D3D2DECAC9EFDAD9EED9D8EDD6D5EE
+ D7D5ECD4D3EED6D6EBD2D1EBD4D2ECD4D3EAD2D2E8CFCEE5CBCAE5CAC9EED2D1
+ E9CECBECD0CEF3D7D5EDD0CEE6C9C7F0D3D1E4C7C6EBCECCECCFCDEED0CDEDCE
+ CCE7C7C5EECCCAEECCCAEDCAC8EAC8C5E5C3C2E5C3C1E7C3C1EAC6C4E9C4C1EB
+ C4C2ECC9C7EAC4C2E9BEBCEBC4C1F2CCC9EEC3C0EBBDBAF2C2BFE1AEABE8BAB7
+ EBBDBAEDBEBBF3C2BEF0BBB8F0BAB7EFB8B5F1BAB7F6C4C0EEB8B5EFB4B0F2BB
+ B8EEBCB8ECB6B2F3C0BCE9B0ACEDB6B2EDBCB7ECBFBBEEBAB6EDB6B3EFB7B4F0
+ BDBAF0C1BDF0C0BCF0BEBBF0BFBCF1C2BEF0BFBBF2C4C1E9BCB9EEBFBCF0C4C1
+ EEC0BDEBBEBCDBB2AFD9B1AEF2C8C5ECC3C1EBC5C3E8C2C0DFBDBCDFBFBDDFBF
+ BEE9CACAEACBCAEECDCCE9CAC8C5ACABDFC7C5EED5D4F4DAD8E8CECCBEA8A6BB
+ A4A3D1B7B5EACECCEED2D0E8CCCAEED0CE8474736F6261F9DCDBE5CBC9DAC2C0
+ D2BAB8D8C1BFD5BFBDC9B3B1E2CCCAEAD3D3E8D4D3F1DBDBEFD9D9CEBCBBCDBA
+ BADAC6C6EDD8D7ECD7D7EED9D9F0DADADFCBCAD8C5C3DBC8C7E6D1D1E8D5D4EB
+ D8D8EFDCDCEEDCDBEFDEDDECDBDBE9D8D8EDDCDBE8D6D6E6D6D5F3E2E0EFDDDB
+ ECDBD9F2E0DFECDBD9FAE8E7756D6C000000766C6CF9EAE8E6D4D2EEDBDAF1E0
+ DFEEDEDDEBDAD9EEDEDDEBDCDBE9D8D8EADBDAEAD9D9EBDAD9EAD9D8EAD9D8EA
+ D8D7E5D4D3E8D4D3E5D1D0EBD8D6EBD7D7E8D4D3EAD7D6ECD8D8E8D4D3DECAC9
+ DBC7C6E4CECDF1DCDBF1DDDBF0D9D8EFD7D6EDD5D4ECD3D2E4CBCAEAD2D1E9D1
+ D0EBD3D2E9D1D0EAD0CFEACECDEED2D1E9CCCBEED0CFF0D3D1EED1D0EACECCF2
+ D5D4E5C9C7E0C2C0DEC0BFF1D3D2F5D7D5EFCFCCF2D1CFF0CECCF1CECDEBC9C6
+ E7C4C2E9C6C4E7C3C1EAC5C3EAC4C2E9C2C0ECC4C2EEC9C6EDC6C3EBBFBCEFC7
+ C5F0C7C4F1C4C0F4C4C1EFBCB9EDB9B6EDBFBCF0BFBBF4C3BFF0BCB8F5BEBAF1
+ B8B5EDB3AFF3BEBAF3BDBAF1B6B2F1B8B4F0BCB9F1B9B4F5C2BEF2B7B3F4BBB7
+ F1C0BCEDBFBBF0B9B6F0B6B3F0B7B3EBBAB6F1BFBCF4C2BEF5C1BDF1BFBCF2BF
+ BCF4C2BEF4C6C3ECBCB9F1C2BEF2C3C0F5C5C2D9AFAD463938876F6DE7BFBCE8
+ BEBBEEC6C3F2C9C7987F7E1F1B1BBBA2A0EDCCCAF3D1CFCEB1B05F5453AB9997
+ ECD1D0F6DAD9B29D9D49403F897876C7AFAEC0A8A7AE9998DEC4C2F3D6D4ECCE
+ CC7C6B6A6F6261FFE5E4DCC4C24B43425A514FAD9B9AAA98977C6F6E605756E8
+ D2D1FBE5E4C6B4B4857978948686A697979185847A6F6EEAD5D4F0DAD9F0DAD9
+ C8B5B4423C3B5E5454E2CFCEF2DEDDEEDBDBE6D4D4EDDBDBF2E0DFEEDDDDEADA
+ D9EAD8D8E9D8D7E6D5D4F1DEDCF0DEDDEEDDDBF1DFDEF1DFDEFBEBEA78707000
+ 0000776E6DFFF3F1F1DDDCEEDBDBE9D8D8EEDDDCEDDCDBEADADAECDDDCECDCDB
+ EDDCDCE5D5D5E9D8D8E9D8D8E9D8D8E7D6D6E9D8D7EAD8D8E3D0D0EBD7D6EDD9
+ D9EBD7D6EDD9D8EDD9D9EDD9D8F0DBDAECD6D5E9D3D3ECD7D7F0DBDAF1DBD9F0
+ DAD8EFD8D7F0D8D7E9D1D1EED5D4EBD2D1EAD0D0ECD1D1E8CECDE8CCCBF2D7D5
+ E9CCCBE7C9C8F1D4D3ECCFCEE7CAC9EFD3D1EACCCBECCECCEFD1CFEBCCCBF0D2
+ D0F1D3D1F0D0CEEFCDCCF0CDCCECCAC7EBC7C5E7C3C2E7C2C0EBC5C3E9C5C2E9
+ C2C0EBC3C0EDC3C0EDC5C3EBC1BEEDBEBCF0C7C4EBC0BCEFBEBBF1BFBBEDB7B4
+ ECB9B6F0C0BCF2BFBCF0BCB9F2B9B5F2B8B4F1B5B1F2B8B5F0BAB6F1B4B0F3B4
+ B0F1BBB8F2B7B3F1BBB7F0B3AFF1B7B3F4C2BEEFBEBAEFB6B2EFB2AEF0B7B3EC
+ B9B6EEBAB7F2BDBAF8C3BFF6C3BFF1BBB8F3C3C0F5C4C1F0C0BCF2C2BEF1C0BD
+ F4C4C2F7C7C45B4948B89896FFD4D1EBC1BEF1C8C5EEC4C2DDB9B73C3333E8C5
+ C3F3CFCCD7BAB8342E2DA28F8EF9DAD9F5D7D5BDA5A5282222BEA7A5FDDDDBF4
+ D5D3F9DBD9E5C9C78F7D7CE2C7C6F8DAD8806F6E726463FDDFDEFEE1DF706463
+ 8F807FFFEAE8F7DDDBFCE3E1A39392D1BCBBC8B5B5453F3FC5B3B2F9E3E2F8E2
+ E1FAE4E38B7F7FD0BDBDF7E2E0F1DBDAFFE9E7756A69817575FBE5E4F0DCDCEE
+ DCDCEEDCDBE9D8D7EDDCDBEFDEDDF0DFDFF3E1E1F1DFDEEEDCDBF7E4E2F0DDDC
+ F0DEDDF2E0DFF3E1E0FFF0EE7971710000007B7170FFF4F3EFDBDAECDAD9EFDF
+ DEEDDCDBF0DFDEECDCDCECDCDCEEDEDEEFDFDFEEDDDCEDDCDBEDDDDCDFCCCCD9
+ C8C8E7D6D6EDDBDAE5D3D2E9D7D6EBD7D7EAD7D6E9D5D4EBD6D6E6D2D1EBD6D5
+ EDD7D7E8D2D2E9D2D2EED8D7E9D2D1EED7D5F4DDDBF3DCDBEFD7D6F1D9D8F4DB
+ DAF2D8D7EDD2D0DFC3C1DFC2C1E4C7C6EDD0CFECCFCEF4D8D7F2D5D4EFD0CFF1
+ D2D0E8C9C7EDCECCF2D3D2EECFCDEDCECCECCBCAEDCECCEFD0CDF2D1CFEECCCA
+ EDC8C6E9C4C1E8C3C0EFC7C5ECC4C1EDC5C3EDC5C3ECC1BFEDC1BFEFC6C4EEC3
+ C0E9B9B6E1B7B5E3B4B1EEBAB7EFBAB7EBB3AFF1BEBBF0BBB8F3BFBCEFB7B3F1
+ B5B1F2B3AFEEB0ACE6AEA9EEB1ACF2B0ACF2BAB6F3B6B2F1BAB6E4A4A0EBB0AB
+ F5C4C0F3BFBAEEB1ACF1B0ACF4BCB8EFBCB7F0BAB5EEB7B3F1BCB9F1BBB7F0BC
+ B8F0BEBBE9B5B2E3B1ADE8B5B2E2B0ADF3C3C0F6C7C4594847A58987E6BEBBE4
+ BDBAFCD2CFECC4C1D8B5B2413736ECC8C6F3D2D14C4443827170F2D3D0E4C4C2
+ F1D0CF4C4342877675FFDEDDEED0CEEDCECCEED0CEFCDCDA958281958382FFE9
+ E78A7978706261FEE2E0FFE4E27366658B7C7BFFE3E2F1D7D7F2DAD9F2DAD9EC
+ D4D3554C4DA89897F9E2E1ECD6D5EDD8D7F0DBDAEFD9D8EFDAD9F3DDDCF5DFDD
+ FEE9E7746A69857A79FDE9E8F3DFDEEFDCDBE8D6D6D8C7C7E3D2D2EEDCDCE9D9
+ D8EEDDDDF1DEDEEAD7D6EDDAD9F0DDDCF1DEDDEBD9D8E6D4D2FDEAE8766D6D00
+ 00007E7573FBECEBE1CECDE2D1D0EBDAD9DFCFCEE4D5D4EADBDAE4D4D4E9D9D9
+ E0CFCEE1D1D0E0CFCFEEDDDDE1D0D0DECDCCE7D6D6E0CECEE0CFCEE7D4D4DFCC
+ CBE1CDCDE8D4D4ECD7D7E1CCCCDDC8C8E6D1D0ECD7D6E2CCCCE3CCCBE0C8C8ED
+ D5D4E3CBCAE5CDCDE5CECDE1C9C8E3CBCAE4CAC9F1D6D4EDD0CFDDC0BFDABCBA
+ EDD0CFEACDCCE6CAC9E2C5C3E7CAC8EBCCCAE0C0BEE0BFBDEBCAC9EAC9C7DEBE
+ BCE3C2C1DCBBB9E5C5C2EACAC8E2C1BFEBC8C6ECC7C5E7C0BEE1B9B6E3BAB7EA
+ C1BFE7BEBBEDC3C0E6B9B7E7B9B6E7BEBBEEC3BFEAB9B6E0B5B2E9B8B4F4BEBA
+ EEB5B1E9AFABE7B3AFECB6B2F4BDB8F4B6B2F3B3AEEFACA7E7ACA7F3B5B1EBA5
+ A1EBB1ACEEAFAAF3BAB5E7A39EF0B3ADEEBEB9EAB1ADEBAAA5F6B4B0EEB7B3EA
+ B3AFF4BAB6EEB5B1E8B0ADF4BCB8E8B6B1E7B2AEEBB7B4E6B1AEEDB9B5E2B0AD
+ EDBDB9EFC1BE55454476605EA58684826B69B09492F0C6C3D4AFAC3D3433BCA3
+ A16E6160514646FAD8D6E7C6C3E0BDBCD7B9B7332D2CD9BCBBE7C8C6E5C5C4E3
+ C3C1DEC0BEF2D3D2A993925F5251FEE3E18C7C7A675958EED1CFF5D8D66B5E5D
+ 726362DAC0BFCFB8B7877978D5BEBED9C2C23E3837E3CCCBE3CCCBDCC6C5E2CC
+ CBDDC8C7E9D4D3E9D4D3E0CAC9F4DEDDEDD7D66A605F857978F6E1E0E1CECCE2
+ CFCDEBD8D7DCCACADDCACBE5D3D3DECDCDEAD9D9E1CECDDECAC9D9C5C3EBD7D6
+ E6D3D2E2D0CFEAD8D6E8D5D46C63630000006E6564E1CCCAE1CFCEDFCECDD9C8
+ C8D8C8C7E5D5D5DECFCFDFCFCFE2D1D1E2D1D1DCCBCADAC9C8EAD9D8DDCCCCDF
+ CFCEE5D4D3DDCCCBE6D4D4E8D5D5DBC8C7E5D2D1EAD6D6E5D1D0DFCAC9E8D3D2
+ DDC7C7E8D3D3DEC8C7ECD4D3DCC5C3EDD5D4DDC6C5E9D1D0DEC6C5E1C9C8DFC5
+ C4E2C7C6DABFBEDCC1C0E1C5C3E7CAC8EFD2D1E5C9C8DCBEBDE3C6C3EED0CFE2
+ C2C1E6C6C5E3C3C1E5C3C1E7C4C2E0BDBBEDCCC9DCBAB8EBC9C7E6C4C1DCBBB8
+ EBC9C7EFCDCBEBC4C2DEB5B3E6BCB9E8BEBBE6BBB8E8BEBBE7BBB8EBBCB9E4B4
+ B1E7BBB9E5B6B3E8B6B2F0C3C0F3BEBAEEB5B1E4A6A2ECB3AFE5ADA9EFB7B3F5
+ B7B3F5B2AEEBA4A0E7A5A1F1B2ADEAA09CF0B3AEF3B1ACEFB1ADE8A29DEFB2AE
+ EEBCB6EEB0ACF0ABA6F3B1ACE7AFABE8ADA9F3B7B3E7AEAAE5A9A5F3BDB9EAB3
+ AFE8B1ADECB5B1E9B1AEF0BBB7E7B4B1F0C0BDE4B6B3534341AE8C8AFFD2CFE5
+ BDBB4C3E3DA48684D8B7B4352E2DB39A98B298978B7675A38A89EBC7C5ECC9C7
+ D3B6B4403736DDBDBBE1C0BEE8C8C7E9C9C8D9BAB8EBCDCB9581804E4444FCDD
+ DB8C7B7A635655F0D2D0ECCECC665958564B49A99594A491904F4645CCB6B6C7
+ B1B03C3635E3CCCBE0C9C8E0CBC9E1CCCADAC5C4EAD5D5DAC5C3D7C2C1E7D2D1
+ E8D2D16D6463817474E5CFCEE5D1D0DDC9C8E0CCCBE1CECDE5D3D3E6D5D4D9C8
+ C7E3D1D0DCC8C7E7D3D2D4C0BFEDD9D8DCC8C7E6D4D3E4D2D1F0DCDB776E6D00
+ 0000706665DFCAC8EAD8D7E3D2D1DFCECDDCCBCAE8D7D7DFCFCEE3D2D2E2D2D2
+ E3D2D2DFCDCDDECDCDE2D1D0DDCCCBDFCFCEDECDCCDFCDCCE2CFCFE3D1D1DAC6
+ C5EAD6D5EBD7D7E3CFCFDFC9C8EBD6D5DFC9C9E5D0CFDDC7C6F0DAD9DAC3C2E6
+ CECDDBC3C2E6CECDDBC4C3E7CECDEED4D3E2C7C6D9BEBDE2C6C5EDD2D0E2C6C4
+ EDD2D0EFD3D3DEC1BFDEC0BEE7C7C6DFBFBDE4C4C2E3C3C1DFBFBDE1C0BDE1BE
+ BCEAC6C4DBB7B5E8C5C2DFBCBAE0BDBBE2BFBDF0CDCAEDC8C6DEB6B3E7BCBAE7
+ BBB8E7BAB7E9BCB9E8BCB8EDBFBCE4B3B0E6B3B0EDC0BDE9B9B5E8B5B1F1C3BF
+ EBB2AFE5A8A4EEADA9E6ADA9EEB4B0F5B7B3EEA9A5E99F9AF0A7A2EAA8A3ECA0
+ 9BEEAAA5F1AEA8EBACA6EEA6A1EBADA8ECB8B3EEACA6F1A6A2EDAEA9EDB3AEED
+ AEA9F0B1ADE9ADA8E9AFABEEB5B2EBB0ACEAB0ACECB2AEE7AFABECB7B3E6B5B1
+ F4C3C0E6B5B2544342A98987EEC0BEFDCECA685554635655DFBFBD3C3231E3BE
+ BBF8D0CEE1BCBA4F4241C4A7A5EAC6C4E1BEBC655756CFB1AFDEBDBBDCBDBCE2
+ C3C2DBBCBAECCCCA534948786969FFE6E4897977635554F3D4D3EFD0CF645655
+ 837372F8DBD9EDD1D0D8C0BFE7CFCED5BEBD474040CFBCBAE2CBCAE0CBC9DEC9
+ C8DCC8C6ECD6D5E2CDCBE3CECDE3D0CEEBD4D36F6464817574E5CFCEEFDBDADE
+ C9C9DECAC9DCC8C7E8D4D3EAD7D7DAC7C6E4D1D0DEC9C8EAD6D5D5C1C0E7D3D2
+ D5C1C0E0CECCDFCCCBEEDADA746B6B0000006C6261E3CECDE6D5D4DBCAC9E0CF
+ CDDDCCCBE0D0CFDECECDE1D0CFE9D9D8DFCECEDAC9C9E3D1D2DECDCCE2D0D0E6
+ D5D5E0CECEE0CECEE0CDCDE2D0CFDECAC9EBD6D6E9D5D5E9D5D3E0C9CADDC7C6
+ E2CDCBE1CBCAE0C9C8ECD4D3DCC4C3E8CFCEE3CBCAE7D0CFEBD3D2E3CACAE9D0
+ CFE1C7C7EED3D2E6CBCADEC3C1DABEBDE7CBC9ECCFCEE1C5C4DFC2C0E4C6C4E9
+ C9C7E1C0BDE3C1BFE1C0BEE4C3C1E2C0BEE6C2C0E5C0BDE7C0BEE8C2C0E9C4C1
+ E5C1BEF3CECAEAC3C0DEB8B6E2BBB8E2B7B5E4B7B4EEBFBCE8B9B6E8B9B6EABB
+ B8EEBBB8EDB7B4EABBB7EBB8B5F1BCB8F1BFBBEAAEAAE9A7A3EDACA7F2B8B3F3
+ B6B2EEA9A4EBA09AF5A6A0EEA9A3EC9F9AEEA39EEEA8A2EDAAA4F4A7A2EEB0AB
+ EEB7B2EDA39EEDA09CECAFAAF1B3AEEFADA8EDAEA9EEAFAAF0B6B2EEB1ACECB0
+ ABEDAFAAEBAFABEDB5B1EFBBB7ECB9B6F5C1BEECBBB7584746AF8D8AF9CAC8E4
+ BFBC3A3231A98F8DDAB5B3392F2EE3BCB9F1C9C6E1BDBB322A2ABA9C9BE7C3C0
+ F4D0CEB59B9A937F7EECCAC8E8C8C6E8C9C7F2D1CFA6908F2C2626D8BDBCFFE0
+ DE877776695B5BF0D1CFFADBD96C5E5D7F7070F8DCDBE5CBCAF0D6D6C8B3B2E9
+ D1D09C8D8D7B6F6EEBD5D3E6D0CEDEC9C8E3CBCAB6A4A3E1CCCBEBD5D5EDD7D6
+ F4DEDD6A605F847877F1DBDAF4DFDEDFCBCAE7D2D2DECAC9E7D3D2E1CECDD8C4
+ C3EDD9D8E1CDCCDCC8C7DECAC9E0CDCCD6C2C1DECBCAEAD7D6EFDBD9736A6900
+ 00007A706FFDEAE9F3E2E1EDDCDBF0DEDDF4E2E1F4E2E1F2E1E0F2E1E0EFDEDD
+ F0DEDEE8D6D6ECDADAE8D6D6E4D2D2E8D6D6E7D5D5EAD8D7E6D3D3E9D6D5E9D4
+ D4EED8D9E9D5D4E8D2D2EBD6D5E9D3D3ECD5D4EBD3D3F1DBD9F1DAD8EFD7D6F0
+ D8D7F6DEDDF1DAD9F1D8D7EAD1D0E9D0CFEDD4D3EDD3D3ECD2D1E9CFCEECD0CF
+ EED0CFECCDCCEBCDCCEED0CFF1D4D2F2D4D2F0D1CFF4D2D1EDCAC8F4D0CEF1CE
+ CCF1CDCBF2CECBECC6C4F4CDCBF1C9C6EFC6C4F2C9C7F0C7C5EEC6C3F3CBC8EB
+ C3C1EDC3C0ECBEBBF3C3BFF2C1BDEFBDB9EFBEBAF3BFBBF2BAB6F4C1BDF3BDB9
+ F3BCB8F3BDB8F1B0ABF2AAA5F1AFABF1B3AEF7B3ADF6A8A3F5A29CF5AAA4F5A7
+ A1F6A6A0F7AFA9F5AFA8F4A59FF4B6B1F5B9B2F4A49EF1A6A0F1B3ADF3AFAAF1
+ ADA8F3B0AAF3B5B0F2B2AEF3B3AFF3B2ADF5B6B2F5BAB6F4BEBAF4BEBBF5C0BC
+ F8C6C2E6B9B6473838937977C4ABA9776665947B7AF7CBC9AB8C8B332A29B496
+ 95C1A2A16E5C5B8D7776F7D2D0F1CECCF2CFCEF5D3D0BDA3A2AB9492D9BCBBD3
+ B6B5907D7B584D4CC5ABAAF7D7D5EED0CE645757483F3FE1C5C4EBD0CE534949
+ 706363CBB5B4C3AFAEA59493817474EDD5D3F0D8D7A29190A89997D8C3C2D1BC
+ BB8E7F7E3D3737BBAAA97E7372C2B0B0CBB9B85C5353716766D1BFBFA89A987A
+ 706EF5E0E0EDD9D8ECD8D7E5D1D1E4D0CFE7D3D2EEDAD9ECD8D7F0DCDBEAD7D6
+ E6D3D2E4D1D0F1DEDDFCE8E6776D6D0000007B7271FFEEEDEAD7D6E4D3D2E4D2
+ D1EEDCDBE7D6D5EEDDDDF1E0DFEDDCDCF1DFDFEFDEDEF0DFDDEFDDDDEBD9D8EF
+ DDDCFBE8E8FDE9E9F8E4E4F7E3E3EEDAD9EFDADAEFD9D9EFD8D8FAE3E2F2DAD9
+ F0D8D7EED6D5F3DCDBEFD8D6F1D9D8ECD4D3F1D9D7F0D8D6F2DAD9EDD5D4EBD2
+ D2EBD3D2ECD3D3EFD6D5ECD2D1EDD2D1EBD0CFE2C5C4E8C9C7EBCBC9E9CBC9ED
+ CECCEDCECCF1D1CFE4C5C3EFCECCEFCBC9EFC9C7EFC8C6E7C1BEEFC8C6EEC5C3
+ ECC1BFEFC4C2D8B1AFE8BEBCF3C9C6EDC3C0F0C7C4EEC4C0F1C3C0F1BEBBECB7
+ B3EBB7B3F0BDBAF2BBB8F1B5B1F4BEBBF5BCB8F6BDB8F6BBB6F5ADA8F2A6A1F1
+ B0ABF5B3AEF6A8A3FBA39CFFA9A3FFB2ABFEA49EF9AFA8FCAFA7F5A29CFFC2BB
+ FFB8B2F9A09AF4ACA5F0AEA8F2ABA5F3ACA6F2AEA9F3B2ADF1ADA7F0ABA6F0AD
+ A8F1B2AFF1B8B4F4BAB6F7BDB9FBC4C1FFCBC7E8B8B5CCABA8D0B0AED7B3B0EE
+ C3C0FFD9D7FBCDCAECC0BEE5BBB9D0ADAAB99998D3B1AFF5CFCDEDCAC8E9C6C5
+ EBC9C7E5C3C2F9D6D4EAC9C8D0B3B2B19897BDA3A2EBCBCAF4D4D2F2D2D1E0C4
+ C3C5ADACC3ACABE1C7C6E6CDCBC9B3B2CEB7B7D0B9B7D1BAB9C9B4B3D8C0C0FB
+ E1DFF4DAD9FEE4E2EAD2D1CCB8B7AE9D9CB09F9DD9C4C3EAD3D2AE9D9DBEACAC
+ BEACACBAA8A7BCAAA9C3B1B0C1B0AFAC9D9BEAD7D6E9D6D5ECD7D6EFDAD9E6D1
+ D0EFDBD9F2DDDCF2DEDCF3DFDEECDAD8EAD7D6E3D1D0E8D6D5FAE5E4736A6900
+ 0000756B6BFFEDECF0DDDCEDDBDAE5D3D2F2E0DFE9D8D7E7D6D5ECDADAE4D2D1
+ EAD8D8EDDCDCEEDCDCF0DDDDE9D6D6E4D2D17F7575766D6C706767615A5A4842
+ 414D4646685F5F675E5D7F7372998A89CFBBBAF0D9D8EDD5D4EFD7D5EBD3D2EB
+ D2D2EED5D4EFD6D4EED5D4EED5D4E9D1D0EAD2D0EBD2D1ECD3D2EDD4D2F1D6D5
+ A89594827372F5D6D4EECECCEDCDCBEBCAC8E8C6C4F0CECCE7C4C2F2D0CEEFCC
+ C9ECC8C5E5BFBCE4BBB8EBC1BFEDC3C0EEC4C1EBC1BE5E4C4BDEB3B0F3C5C2EC
+ C0BCEEC3C0ECC0BDECC1BDEEC0BCF1BDB9EEB8B4F2BBB6F1BAB6EFB7B3EEB0AB
+ F3BAB6F5BAB5F7BDB8F9B8B3F4A59FF6A9A3FFBBB5F9ADA6D48882B5716C8E60
+ 5C784C49523A38442E2D68434081635FA06F6ACA7F7AEDA9A3FEB1ABF7AAA4F2
+ A7A2F4AFA9F4ABA5F3A9A4F2AAA5F1B0ABF1B6B1F3B7B2D5A19EA7817E866765
+ 7F63617C6765816E6D816A697D656478615F786260826968967A78B69492EAC3
+ C1F4CCCAF4CECBEDC9C7EFCCC9ECC8C6F0CDCBF6D2D0D1B3B1AE949389767573
+ 6261796867B89F9EDDC0BFB59E9DA08D8B8E7C7C837473786B6B837574887978
+ 7C6E6D786A69776A69776B6A6F6363665B5A6156566359586C61617B6E6E8D7E
+ 7EA09090BFACABE4CECDFFECEBF8E1E0F3DDDCF5DFDEF6E0DEF4DDDCF9E2E1F0
+ DAD9F2DDDCF2DDDCECD7D5EAD5D4E3CFCEE7D2D1ECD7D6F3DEDDF2DEDDF5E2E0
+ EDDAD8DFCCCAE2CFCEFEE9E87B7271000000766D6CFDECEBF3DFDEF0DCDBE9D6
+ D4EEDCDBECD9D8E7D4D3E4D2D1E1CECDDFCDCDE4D2D2E5D3D3E7D5D4EDDAD9CE
+ BDBC0000000000001210104C4545716666887B798F81818E81806D6362554D4C
+ 413A3A7B6F6FECD5D4F0D9D8EDD5D5F0D8D7EFD6D5EED6D4EBD2D1E9D0CEE9D0
+ CFEBD2D1ECD3D2EBD0D0EBD1CFFADEDD786A6A262121E8CBC9EED0CEEFCFCCED
+ CECBE9C8C6ECCAC8E6C3C0EDC8C5EFCAC7EBC6C3EAC4C2EBC6C3EEC6C4E4BAB7
+ F2C4C1BA9794070606C6A09EF7C7C3EDBDBAECBCB8EBBCB8E6B8B4E5B7B4F5C6
+ C2F0BCB9F3B9B5F0B5B1F2B7B3F0B5B1F1B0ACF5B9B4F5B8B2F7BAB5FAB0A9F4
+ 9E98AE78737C5855623E3C50302D5B3C39724643754A47724D49784E4B684F4B
+ 3E2927482E2C6649468D605CE29893FFB0A9F5A9A3F3A49EF2A39EF1ABA6F2B3
+ AEF2B2ADF1B5B0EBB2ADDBA6A3CFA9A6BFA09C3A2E2D4B3938755B590000000E
+ 0B0A9B7B79BC9694DAB3B1DCB5B3E9C2C0EAC3C1F2CCCAECC6C4EAC4C3EDC8C6
+ EEC9C8957F7D7967677A6766040303191616A69190E0C4C2E5C7C5DBC0BED4BA
+ B9C9B0AFB09B9A1B18188878786B5F5E0000000000000000001412123F38385C
+ 5251685D5C685D5D584F4F35302F2A2626373232383232342F2F776C6CDAC6C5
+ F6E0DFE8D2D1E7D2D1E8D3D1E9D4D3E4CFCFEDD8D7ECD7D5EBD6D5EBD6D5E1CD
+ CCE3CECDE1CDCCEAD6D4E5D1D0F4E0DFF1DDDCF1DEDCEDDAD9FBE7E6786F6E00
+ 0000706766E2CECCE9D6D5E4D0CFE2D0CEE1CECDDCC9C8EEDBDBD7C6C6DAC8C7
+ E1D0CFD6C4C4E2D0CFD8C6C5EBD7D7AE9F9E010101857877DEC9C9EBD5D5E7D1
+ CFF0D9D8F4DEDDE6D0CED4BFBD9485848C7D7D504847433C3CDBC5C3E3CBCBEB
+ D3D3DEC5C4E5CDCCE2CAC9E0C7C6E0C7C6E8CFCEE5CCCAE1C7C6E1C6C5EACECC
+ 635756000000B19A99F0CFCEDCBCBAE5C4C2DCBAB8E5C3C0DDBAB8E9C5C2E4BF
+ BCE0BAB7DDB5B3EAC2BFE4BCB9DBB4B2EFC4C1745F5D000000886B69FBC8C4E4
+ B5B1EEBCB8EBB6B3E6B2AEE7B4B1F3C2BEF3C3BEECB9B5E9B0ACEAABA6ECADA8
+ EBADA7F2ADA7F1B0ABFCB8B1C9928D714B487044414D383662403EB46762E98D
+ 86FA958CFFA39AFFB1A8FFA9A1F3B5ACD17E76895A555A3F3C5C3C38462E2C95
+ 6661FFA6A0F69F99EFA39EEEAAA4F1ACA7EFAFA9ECABA6EEB5B1EBC0BCECBEBA
+ FFCBC78264617D615FA9827F0000003D302FECBCB9E9BCB9F3C8C5EFC4C1E0B6
+ B4E1B9B6F0C9C6E2BBB9E8C2C0ECC5C3877170877372C0A5A41814141C1817D4
+ B7B6F2D1CFE1C2C1E8C9C7EDCFCDE1C4C2E3C5C4F9DBDA544A4A9784827A6A69
+ 0000003C3534B8A2A0DDC4C3E5CBC9EED4D2EED3D2F3D9D8E9D0CFDFC8C7B8A4
+ A3817474615756635959282424100F0F847777DCC6C5E0CBC9DFCBCAD7C3C2E6
+ D2D1EDD9D7DAC5C4DEC9C8E7D3D1DCC8C6E4CFCEDBC8C7DAC6C5DAC6C5E9D5D4
+ D4C0BFEAD7D5E7D4D3E5D0CE685E5D0000007A7170EBD7D5EEDCDBDECBCAE4D1
+ D0DAC7C6E1D0CEEDDCDCDFCECEE1CFCFEFDEDED9C9C8E9D8D7DBCACAF6E3E3AF
+ A0A0221F1FD8C4C3ECD7D6E6D2D0DCC6C5E8D2D1E7D0D0D8C2C1E3CDCBEAD2D1
+ 8C7E7CAE9C9B332E2E594F4FE4CBC9F0D7D6DDC5C4EBD3D2E1C9C8ECD3D2E4CB
+ CAE4CAC9E1C8C7E7CDCCE8CDCCCDB4B3847373453C3C5F5152FCDAD9DEBDBAF3
+ D0CEE4C2C0DCB9B6DDB9B7ECC8C6DAB6B3F0CAC8E1BBB7E3BBB8DEB5B3EDC3C0
+ C7A19F77615F614F4E4F403EF5C3C1E4B1ADE9B6B3E4AFACEFBAB6F4BCB8F5BC
+ B9F0BAB5E6B4B0EEBBB7E9B1ADEFADA8EFAAA5F1AEA8FDB1ABA5787464474585
+ 5E5A351D1C95605CFBADA5FF9890FD8B83FD938AFC9A90FCA39AFDA49AFEC4BB
+ FF9187FFB4ABC8827C62403C805450301E1D633F3CF3A19AF8ACA6F1A9A3EFA8
+ A4EFADA7EEBBB6E9BDB8F0B9B5E9ADA9F4B5B18764627F6260A27C7A00000050
+ 3F3EF6C7C3F2C4C1F1C5C2F5C9C6E5BAB7E6BCBAEDC6C3E3BDBAF1CBC9A88E8C
+ 826F6ECBADAB1C1818050505B69C9BF0CCCBE5C3C1DDBDBBE8C8C6E7C8C7DABD
+ BBDABEBCF9DAD96D605F907D7C7666650000007E706FF2D5D4EFD6D5DCC4C3F1
+ D9D8E2C9C9DAC2C1EDD6D5E5CECDE3CCCBF3DCDBC4B2B15D5453908281595050
+ 000000514949E0CCCBEAD5D5DAC6C5E8D4D3EBD7D6DECBCAD9C5C5DECAC9EAD6
+ D5D9C4C3E5D1D0E3CFCDE0CCCBE5D2D1DAC6C5F6E2E1EEDBDAEFDBDA655C5B00
+ 0000736A6AE9D6D5E5D4D3DCCACAE3D2D1D9C8C7E7D5D5E3D1D1DBCACADAC7C6
+ E3D2D2D7C6C6E2D1D0D9C8C7EBD9D9A29595696060E3CDCCE2CDCCE3CFCEDAC4
+ C3E3CDCDE5D0CFDBC4C4DDC6C5E2CBCACDB7B6786C6BA79393040403AA9695F3
+ D8D6DBC1C0E1C8C7DFC7C6E4CACAE0C7C6E4CACAE0C6C5E8CECDEACFCEA79392
+ A69292706262131111E2C3C1DDBBB8E9C6C3DEBAB8DEBBB8DFBAB8EBC7C4DBB6
+ B3E7C1BFE0BAB8E6C0BDDDB6B4F5CBC88A716FA887856D5756120E0EDDB0ADE4
+ B5B2ECBBB7E7B2AFEDB6B2E6ADA9F2B7B3F1B4B0E7ABA7EEB6B1EBB6B0EDB6B0
+ F3B2ADF9ACA6996B686747439B6C69151312A2716CFF9D95FFAAA0FC9E95FD80
+ 77FF9288FFA59BFFAAA0FFA298FFB8AEFE9389FEABA1FFA198E7968E5B39369D
+ 5E592B1B1A4D3432F8A9A2F4A9A3F0B2ACECBDB8EFB9B4EBABA6EBA9A4E8A9A4
+ F0B1ADA279768467659F7C79000000644F4EFAC6C3E1B0ACECBEBAF4C8C5E6BB
+ B9E6BFBCEDC8C5E8C3C1D7B7B5705E5DDEBCBA3A3231000000847270F6D3D1DF
+ BCBBE3C1BFDFBEBCE2C2C1DDBFBCE4C6C4E2C4C3F5D6D4766867927F7E766666
+ 000000978686E7CDCCE5CBCADBC3C2E5CECCDFC8C7DDC6C5E7D0D0E4CECCDCC7
+ C6E3CDCCF5DFDDD6C0BF695F5E968887675D5D0000004F4848E0CCCCDFCBCAEF
+ DADAEFDCDBD8C5C4DBC8C7D8C4C4E0CCCBDCC8C6D9C5C4D6C1C1DFCBCADDCAC8
+ D8C5C3F4E0DFF1DDDCEBD6D5655B5A0000006D6464E5D3D1E7D6D6E5D3D3E2D1
+ D0DCCAC9E5D3D3DCCBCAE1CFCEE2D0D0E1D0D0E2D1D0E6D5D4D9C8C7EFDDDD94
+ 89899B8E8EEAD5D4E3CDCDE5D0CFE4CECDE4CECCE5CFCEE4CDCDE1CBCAE2CBCA
+ EBD2D1736767B4A09F322C2C615655F5DAD8E2C8C6E2C8C7E7CDCBE2C8C7E4CA
+ C9E6CCCBE0C6C4E9CECDEED2D1887877C3ABAA3932320000009B8684EDCAC8E7
+ C5C2E4C2C0E6C3C0DFBAB9E9C4C2E5BFBDE5BEBCE7C1BEE6BFBCE7BFBCE1BBB8
+ 6E5A59CDA8A5151211000000B5908DF5C1BEF6C3C0ECB9B6E8B3B0EDB5B1F2B7
+ B2EFB0ACEEAEAAEDAAA6EEACA7F1B4AEFFC5BFAE807C5A3C3BB37B7609060695
+ 6560FFC2B9FEA79FFE8D83FFACA2FF8F84FF968BFFABA0FFB8ACFFBEB3FFB1A6
+ FFAFA4FFABA0FE9E94FF9E94E07E765E3A37C17F790C06066E4B49FEC2BCF6C2
+ BCEFACA7F1A9A4F1ABA7ECACA8F2B6B2FBC1BDAB8481866764A37C7A00000075
+ 5B59F9C3C0E8B9B6EABEBBEDC3C0E5BDBAEBC3C1E9C1BFE9C2BF7C6767CBAAA8
+ 7B67660000003F3434EDC9C7EFCDCBDDBBBAEAC9C7E6C6C4E7C8C6DEC0BFEBCD
+ CCE4C7C5F2D3D18D7C7A9D8A897A6C6B0000009C8C8BEED4D3E2CBC9EED6D6E7
+ CFCEE9D2D1ECD4D4E6CFCFE7D2D1E1CBCBE3CDCCE1CBCAE4CECDDFCAC9564E4D
+ B09F9F5951510000006D6363EBD7D6E8D4D4E9D5D4E3D0CFEBD8D7E2CECDE6D2
+ D1EBD7D6DAC6C6DFCBCAE6D1D1E4D0CFE3CFCEF4DFDEF1DDDCF2DDDC6D626200
+ 0000776E6EEBD9D8E4D3D3E7D6D5EEDDDDE8D6D5EBD9D8ECDBDBE8D6D6ECDAD9
+ EDDCDDE8D8D8E1D0D0D7C7C6F0DDDDBBADADDAC9C8EBD6D5EAD4D3F1DCDBEED8
+ D6E0CBCAE4CECCE5CFCEE4CECDE7D0D0F0D7D6776B6BAA98975249492F2A2AEE
+ D4D2F0D5D4E7CDCCE8CFCDEDD2D1EED3D2ECD0CFEACECDEED2D1E2C7C6867675
+ C1A9A80908080000004C4241F3D0CEE9C7C5E8C6C4EAC8C5E9C5C3EDC8C6E4BF
+ BCEBC5C3EBC4C1EAC2BFF8CDCAA58885A48683856C6A0000000000007E6665FC
+ C9C6F0BFBBF2BDBAEEB7B3F3BAB6F1B8B4EEB3AFEFB0ACF0ACA7F0A7A3F8ACA7
+ E19D984D3937C3908B231817452B28FDA79EFFABA2FEB9B0FF9F94FFAFA4FFBA
+ AEFFAC9FFFB5A8FFCABCFFEDE5FFC6BAFFCEC1FFB8ADFFA99FFF897FFF9F95A1
+ 66618A5954966D69000000B88884FFAFA9F5A8A2F3ADA8EEAEA9EBAFABE8ADA9
+ F3B6B1BB8D8A8E6D6BA8817F000000765E5CFFD0CDF0C2BFECBFBCECBFBCEABE
+ BCF3C8C6FBCFCDA98C8AA28785C3A2A0080707120F0FC6A8A6E7C3C1E1BFBDDF
+ BEBBF0CFCCF3D3D1F3D5D2ECCECDEFD2D1F2D5D3F8DBD9938281A18F8E7F7170
+ 0000009A8B89F1D7D6E8CFCEE9D1D0E9D1D0E8D0CFECD5D5F0D9D9F0D9D9EFD9
+ D8EFD9D8EDD8D7EBD6D6F3DEDDC3B3B2514A4AD4C2C21A1818070606BFAFAFF2
+ DEDDE6D4D2EBD7D7EAD7D7E8D5D4EAD6D5EDD8D8EED9D8F1DDDBEDD9D8EDD9D8
+ E3CFCEE7D3D1E7D4D2F6E0DF736968000000766D6DF4E2E0E2D1D0E8D6D6F2E0
+ DFEBDAD8E8D6D5EBDBDAE9D8D7EDDBDBECDCDCE8D8D8E4D3D4E2D1D1E9D9D9EE
+ DCDCF3E0E0E8D3D3EDD8D7F1DAD9EFD9D8E2CDCCE1CAC9E5CFCEE3CCCAE8D0CF
+ F1D8D76F6463C2ADAC443D3C211D1DE5CDCBEED4D2EED3D2ECD2D1F0D5D4EFD3
+ D2ECD0CEE9CCCBF4D7D6CAB2B29B88879985840000001613130B0A0AC5A8A7F2
+ CFCDE7C5C3EBC7C5EAC6C3ECC6C3E8C2C0E9C2BFEAC2C0EAC2BFE9C1BE725E5D
+ D1ABA8221C1B120E0E362B2B392D2DF2BFBCEFBCB8F0BDB8ECB7B4F0B8B4F1B7
+ B3F1B5B0F1B3AEF4B3AFF2AEA8FFB1AB7A514EA06965875C58000000C7918BFF
+ AEA5FE9E95FFB7AEFFD0C7FFB7A9FFDACDFFC9BBFFCEBEFFEDE4FFFDFBFFE3D8
+ FFE6D9FFCCBEFFA79BFFA197FFA197F9A79E635351D69D962013122A1A19F3A7
+ A1F9B3ADF5B2ACF3AFAAECA9A4E9A9A5EFB2AFCD9D9A937370A5817F00000074
+ 5A58FFC7C4EBB9B6EBBBB8EDBFBDE9BDBBF4C9C7D0ACAA786463E5C1BE2F2727
+ 0000008E7977FED9D6E4C3C1E7C6C4EFCECBE8C7C5F0D0CEEFCFCDE8CCCAEBCF
+ CEEDD1D0FADEDC8F7E7EA492918274730000009A8B8AF4DAD8EDD4D2E7CECEE7
+ CFCDE1C9C7E2CBCAE9D2D1ECD5D5EAD3D3EDD7D6EDD7D6E9D4D3E9D4D3F8E1E0
+ 7268679D8F8F8F8382000000524B4AF3DFDEE6D3D2EDD9D9EDDBDAEAD8D8E9D7
+ D6EBD6D5EDD8D7EBD6D5E9D5D4E8D5D3DECBCADFCCCBEEDAD9F3DFDE73696800
+ 0000766D6DFAE8E7F8E7E6F4E3E2F3E1E1DDCCCBE5D3D2EEDCDBE4D4D3EAD9D9
+ EEDEDEEBDBDCEBDBDBE8D7D8DECDCDE0CECEF1DDDDECD8D7EDD9D8EFDAD8E3CD
+ CCE7D0CFEBD5D4EAD4D3EAD2D1F4DBDAB8A5A46E6261D5BEBC0E0C0C393333EA
+ D2D0F0D6D4EDD3D1E8CDCBE4C9C8ECD1D0EED3D2E8CCCBF5D7D59F8B8AB8A09E
+ 594E4D0000009C8685262121625453F6D2D1E8C6C4E9C5C4EAC7C4EAC5C4ECC5
+ C3EBC2C0EBC3C1F1C6C3AF908E997C7A9F817F000000705A59B99492070606D3
+ A7A4F7C1BEF1BBB6F1BAB6F3BAB6F4B9B5F3B7B3EFB2ADF2B2ADF5B1ABDC9D98
+ 5C403EDE968F120B0A392220FDAAA1FFBAB2FFB9AFFFB9ADFFDBD1FFEDE6FFE4
+ DAFFF6EAFFF0E2FFFFFFFFFCFCFFF7F3FFF8F0FFD6C7FFC0B2FFC7BBFFC1B9FF
+ CDC395635DB16E68905F5A000000A6736FFFB4ADF5ADA7F4B2ADF4B6B1F3B8B3
+ F1B5B1C99693926E6BA47B78000000755A59FEC8C4ECBBB8E9BBB8ECC0BEEBC0
+ BEEDC4C2756261CDAEAC6F5E5E000000514545F0CDCAECCAC8ECCCCAF5D4D2F6
+ D4D2ECCBC9EBCBC9F2D3D1ECCFCEECD0CEEED2D1F8DCDAA08F8EA694947F7171
+ 0000009B8A89FBDFDEF2D8D7F0D7D5ECD3D2EBD2D1E7CFCEEAD2D1EBD4D3E8D1
+ D0ECD5D4EED9D8E8D3D3E9D4D3F1D9D9C7B5B4534C4CD5C3C20F0E0E040404CD
+ BBBBE8D5D4E6D3D3E9D7D6E7D5D4E9D7D6EEDADAF0DCDBEFDBDAECD8D7EEDAD9
+ EDDAD8EEDAD9F2DEDDFEEEED7C7271000000716968EDDBDAE4D3D2E8D7D5F4E2
+ E1D9C8C7E0CDCCECD9D8E0CECEE6D5D4EBDADAE4D5D4E7D6D6EBDADAE6D4D4D9
+ C7C7E2CFCEEAD5D4E9D4D3ECD7D6D6C0BFDDC6C5EAD4D2E3CCCBEED6D4C1AEAD
+ 4F4747D5BEBC8678770000006C5F5FF1D6D4E6CCCBE2C7C6E0C4C3D8BDBBE8CC
+ CBE5C9C8E6CAC8F4D7D5857473C7ACAA161313161313EBCBC8867472120F0FDA
+ BBB9ECCAC8E5C2C0E7C5C2E6C2C0E9C3C1E7BFBDEBC3C1F0C6C376615FC69F9D
+ 312827080606D2A7A5EFBDBA161111967472FBC1BEECB4B1EDB4B0F2B7B3F3B6
+ B3F2B3AFEDADA8F5B2ADFEB7B2996E6A9D6E6AA87570000000895752FFA59CFF
+ 968DFFB8ADFFE1D5FFEADDFFFBF4FFFDFBFFFFFDFFFEFDFFFFFFFFFFFFFFFFFF
+ FFFEF5FFF2E7FFE5DAFFE7DDFFCBC2FFA59ACE7D767C534ED28B850000004D34
+ 32F8AFA9F5AEA9F2ACA7EFA9A4EFABA6F1AFABC7918D926F6CA47E7A00000075
+ 5D5BFAC8C5EABEBAE9BFBCEFC6C3FCD2CF947C7BAB908EAE9391000000151212
+ D4B6B4F5D1CFE8C5C4EBC8C6EAC7C4ECC9C7F1CECCEFCDCBEACAC8E8C9C8EDCF
+ CEECCECDF3D4D2B9A4A2A995957C6D6D000000958483F2D6D5E9CFCEE8CECDEC
+ D3D2E8CECDE8D0CFE9D0D0E6CFCEE7D1D1E6D1CFE9D4D4ECD7D7EAD5D4E6D1D0
+ EBD5D5544D4DCAB9B8514A49000000877C7BF5E1E0E2CFCFE5D4D3E9D7D6DDC9
+ C9DFCCCBE6D3D3E8D6D5E3CFCEEAD7D6E6D3D2ECD8D7ECD8D7F2DDDB71676700
+ 0000797070E9D7D6DBCAC9D8C7C6EEDCDBE0CECDDDCBCAE5D4D3D5C5C4DECCCB
+ DDCCCCE3D2D2D9C7C7E9D8D7DECDCCDBC8C9E6D4D3E7D3D2E3CECDE9D4D4D7C0
+ C0E0CAC9E6CFCDE2CAC9958584484040C3AEADAF9B9A0A0909080707B7A1A0F2
+ D8D6DEC3C2DEC3C1ECD1CFDBC0BFF0D5D3DDC1C0DFC2C1CEB3B28674739F8887
+ 000000594C4CFAD8D6D8BBBA0C0A0A937E7DEFCDCBDFBDBBE1BEBCDEBAB8E2BD
+ BBDDB6B3EFC6C3C2A09E866C6BA1817F0000005C4948FBC9C5F0BBB84F3D3C56
+ 4240EEB4B0E4AAA6E3A7A3E7A8A4EFAEAAEAA8A3EBA7A2EFA9A4F6ACA6674745
+ CE8D885B3E3B000000B37973FFAEA4FFA99EFFB2A7FFCABDFFF1E7FFFEFBFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F3FFDDCFFFC6B9FF
+ B0A5EE9A9168423FE7968F170F0E120C0BE69994F5A8A2ECA7A1ECADA7EBB1AC
+ F2BAB6C99A97917270A27F7D000000735B59FAC7C4E8B9B7E8BBB8FECFCCB091
+ 8F796363BD9C9A161212000000987E7DF2CBC9E5C0BEDFBAB9E1BCBADCB7B5DB
+ B7B5E7C3C1E5C3C1DFBFBDDEBEBCE2C3C2F0D1D0F5D6D4B29C9BA38F8D776968
+ 0000008D7C7CECD1CFE5CCCBD9C1BFE4CBCBDDC5C3DCC4C3DCC5C4E2CCCBE8D2
+ D2DAC5C5DFCACAEDD8D8E7D3D2D5C1C0F4DEDD7B72719C8F8D8A7E7E00000057
+ 5150ECD9D8DAC8C8E2D1D0E9D5D6D6C2C2E2D0CFEDDADADFCDCCD0BCBBDECAC9
+ D9C5C5E0CDCBD8C5C5EEDBD9695F5E000000786F6FE6D3D3E8D6D5DECCCBE0CF
+ CEDDCCCBE2D0CFEBD9D9D8C7C7D8C6C5DECECDEDDCDBDBCACADECDCDDCC9C9E9
+ D6D7E8D6D6EAD6D5E5D1D0DCC6C6D7C1C0E5CECCDFC9C8695E5E685C5DE3CCCB
+ 9A89870F0E0E000000726464E3C9C7E6CCCAE3C9C6DFC4C3EBD0CFDABFBEE2C6
+ C5E0C3C2F7D9D7A8908FA58F8E6F605F000000947E7DF7D6D4EFCECD5C4F4E37
+ 2F2FE5C4C1E7C4C3E5C2C0E4C0BEE3BFBDE2BCB9F7CECB846D6CB69492413534
+ 000000BA9694F4C4C1F0BDBA9B7A781D1615DDA9A6F0B7B3ECB2AEE5A8A4E7A8
+ A3ECAAA6F3AFAAEFA7A2E39C9760403EE596902A1B1A020101D5817AFF9E94FF
+ ADA2FFC8BBFFDBCEFFF2EDFFFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFDFAFFEBDFFFCEC0FFB5AAF99D93704742E4968E3E2A280000
+ 00C58E8AFEB9B2EFAEA8F1B2ADEAABA7F2B4B0CA9692916D6BA47B790000006B
+ 5352F4BFBCE3B4B0E1B3B09E7F7D62504FA183811F1918000000836E6EEEC7C5
+ EFCBC9E6C2C0E6C3C1E3C0BFE6C4C3E2C1BEE4C3C0E5C4C2E8C9C7E8CAC8DDC0
+ BEF0D2D1EED1CFA69190AB98977D6F6E0000008F7F7FF1D7D5F0D8D7E2CBC9E0
+ C9C8DEC7C6E3CCCBDDC8C7E6D0D0E7D2D1D9C4C3E3CECDEAD5D5E3CFCED7C3C3
+ F4DFDF887D7C847878A79899000000343130E7D5D4E0CDCDE9D7D7E7D4D3D7C4
+ C4E6D5D4EAD8D8E8D6D5D2BEBDD4C0C0E4D1D0E2CFCDD8C5C4FCE9E76B606000
+ 0000746B6BE6D3D3EBD9D9DCCACAE0CECDDAC8C8E3D2D2E3D2D2D8C7C7E4D2D1
+ DAC9C9DDCCCCD9C8C7E6D5D4DBC9C9DBC9C9D9C6C6E4D0D0DFCACAD6C1C1ECD5
+ D4A896954D4544948482D7BEBD6B605F000000000000605555E0C6C4E4CAC8DB
+ C1C0DDC3C1DCC1C0E3C7C6E0C4C2E0C4C3E0C3C1F6D7D5837170C0A6A5312A2A
+ 090707C9ACAAEBCAC9E4C3C2C0A5A4090808B69B99E7C3C1DEBBB8E4C0BEE3BE
+ BCE6BEBCCEABA97E6766B79592000000463837EFC0BDE3B4B1EEBDBAD8ABA816
+ 1110AF8582F3BBB6EBB3AEE7ACA8E8ABA6EBACA8F0B0ABEFABA5D59691684845
+ E49A940C08080B0707EC958EFFA096FFA89DFFB5A8FFD9CAFFFFFAFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF7FFEEE0FFCABBFF
+ B6AAFFABA16C4843E197905B3D3A0000009D6D69FEB1ABEFABA5F1B0ABEAACA8
+ F1B5B1CA989491706EA27E7B0000000C0A09342A29372D2C231C1C000000251F
+ 1E010101100D0E9B8281F8D1CFE2BEBCE5C3C0E2C0BEE2C0BEE8C6C4E0BFBDE0
+ BFBDE4C4C2DCBCBAE5C7C5E1C4C2DEC1BFF1D4D2F2D5D3A48F8FAC9898796B6B
+ 0000008E7E7DE4C9C8DFC6C5E1C8C8D9C2C1E2CBCAE9D2D2DCC6C6DEC8C8E1CB
+ CAD8C2C1E2CCCBEFD9D8E6D0D1D8C4C4EBD7D6918585736969BAAAAA0000002A
+ 2727E0CDCDDAC6C6D7C3C3DAC6C5D6C3C2E7D4D4EBD9D8E2D1D0D5C1C0D9C6C4
+ D4C1BFE7D4D3D6C3C2E7D2D1685F5E000000706767ECD8D9ECDCDAEBDAD9EEDD
+ DCE6D5D5E5D5D5E8D8D8E4D3D3ECDBDAE6D5D5DFCECEE4D3D2ECDBDAE4D1D1E3
+ D1D1E5D2D2E5D1D1EBD6D5E3CECD8679795C5352D2BDBDB7A4A2282323000000
+ 080707877878F0D6D4F3D9D8E9CFCEE4CAC8E8CDCCEBD0CEE8CDCBEACECCE4C8
+ C6DEC1C0DFC2C07C6B6ABDA3A2030202423938ECCBC9F0CFCEEACAC8F5D2D13E
+ 35355E504FF4CFCDE9C4C2EAC6C4E5C0BDF6CCCA907876C19F9D5D4D4C000000
+ AC8B89FCCBC9ECBDB9EFBDBAF5C0BD403231765958FCC0BCEFB2AEF0B1ACEBAA
+ A5ECA8A4F3ACA7F0A49FD5918C684441E8948E0B07070B0706ED8981FF9086FF
+ 9A8FFFB0A4FFCCBCFFF5E9FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFF2EDFFDFD4FFC2B86A4C48E5A39C5C423F0000
+ 009C726EFFC0B9F5B6B1F1B4B0F0B5B1F5BCB8CF9F9C927270A5817E00000050
+ 3F3EBC9694B18E8CB2918F9379774E4040211B1B3F3434615150B99C9BF1CBC9
+ EBC7C5E8C5C3E8C5C3F1CECCEFCECBEECECBF0D0CEEACBC9EECFCDECCECCEED1
+ CFEFD1D0F6DAD8A99494AE9B9A7D6F6F000000948584F2D7D7EDD4D2E2CAC9D6
+ BFBEE4CDCCECD5D4E2CBCAE9D2D1EBD5D4E6D0D0E8D2D2E8D2D2E8D2D3E6D3D2
+ EEDADAAA9D9D7F7473C5B5B40000002C2829E9D5D4EFDBDAE8D4D4E7D4D4E4D1
+ D0E8D5D4EAD8D7EBD9D8E8D5D4E7D4D3DECBCAEAD7D6E2D1D0F0DEDC756C6B00
+ 0000776D6CFBE7E6E8D7D6F0E0DFF1E1E0EDDDDDE9D8D8EEDDDDECDBDBEAD8D7
+ ECDBDBE8D7D6EAD9D9EAD8D9E8D6D6E9D7D7E4D1D0E7D2D1DBC7C75F56568E80
+ 7FDEC7C67C706F000000000000332D2DB4A09FFADFDDEED5D3EED4D2F0D6D4EB
+ D1D0ECD2D0EED3D2EDD1CFEBD0CEEDD1CFDEC0BFB79E9D958281968381000000
+ 82706FF2CFCCECCAC8E7C6C4F8D5D39983810F0D0CD9B8B6EFCAC8E9C4C1EDC4
+ C2DFB8B6836C6ACCA8A5040303372C2BF0C2BFF0C0BDF0BDBBEEBAB7FDC4C080
+ 6360382A2AF3B7B3F1B2AEECABA7EDAAA6E9A4A0EAA39FF4A8A3DE99956B4845
+ E699940F0A090B0706ED9088FF998FFFA99FFFB5A8FFCBBCFFF5E6FFFFFCFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFF3ECFFF5EFFF
+ E5DAFFD3C869524EE5B0A95B4643000000A57E79FFC5BFF5BDB7F2BBB5F1BBB6
+ F7C1BDD1A4A1927471A684820000007A6362FFD2CFF1C4C1F1C6C3F8CDCBF8CE
+ CCC3A3A2705E5D605050040303857170F5D0CEEFCCCAEFCCC9EDCBC8EECCCAEC
+ CAC8EECDCBF2D1D0EECECCF2D4D3F3D4D3E9CBCBF2D6D5AE9A9AA59291786A6A
+ 000000968685FADFDFF4DAD9E1C8C7DAC2C1EED6D5EFD8D6EAD3D2EBD4D4E8D2
+ D2E9D3D3E7D2D2E9D4D4E8D4D4ECD8D8F6E1E1998C8C857A79C3B3B20000002D
+ 2A2AE9D6D5F1DCDCEBD8D6E9D5D5E8D4D4E4D1D0E8D5D4EAD8D7EFDBDAECD8D7
+ ECD9D8EFDDDCF1DFDEFFF0F07D7474000000786E6DFEEAE9EBD8D7E9D8D7F0DF
+ DFEBDBDAE6D5D5EFDEDDEDDCDBECDADAE9D8D8E7D5D6E6D5D5E9D7D7E3D2D1E3
+ D1D1EAD6D5DAC6C55B5353A29292C8B4B235302F000000070606746968DDC6C5
+ EBD1CFEDD3D2EBD1CFEAD0CEEBD1D0E4C9C7DFC4C3E9CDCCE6CAC8E3C6C4EED0
+ CFF7D8D69B8786B9A19F584C4B000000CAAEADF5D1CFEFCDCBEBC8C6EECBC9DF
+ BDBB1A17168B7573FBD3D1EEC6C3FED3D1A58987B394916E59580000009D7F7E
+ FBCCCAEBBDBAEBBCB9EDBDBBF6C2BFC69C99181312D9A9A6F5BEBBEEB6B2F2B8
+ B4F2B7B2F0B2AEF7B6B1ECAAA5624542E69A9432201E020201D78079FF968CFF
+ 9B91FFB9AEFFD3C6FFEDE2FFFEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFAFFEFE8FFECE1FFDBCDFFB2A6F6A39A664441E7A69F3D2D2B0000
+ 00CA9B96FDC4BFF3BDB8F2BCB8F0BDB9F6C3BED0A6A2927573A5848200000075
+ 605EFDCECAE9BFBCEAC1BFEAC3C0ECC6C4FBD3D1B69A988571706A5A5A000000
+ 917C7AF5D1CFEFCECCF0D0CEF2D2D0F1D1CFF0D0CFE9CAC8EACCC9EDD0CDEDCF
+ CEE8CCCBEFD3D2B39F9EAA97977C6F6E000000988787FCE1E0F1D8D6E6CDCCEA
+ D1D0EED6D6EED6D5EED7D6E8D1D0E4CDCDE4CECEE8D2D2E9D5D5EBD8D7EBD7D7
+ F4DFDF897E7D9D8F8FA09292000000403B3BEEDAD9EAD6D6F0DCDCECD9D8E8D5
+ D4E8D6D5E8D6D5E6D3D2E6D3D2E6D4D3E0CECDE5D3D2E8D6D6FDEAEA7E747500
+ 0000796F6EFFEFEEF3E1E0EFDDDDF1DFDFECDCDCE4D3D3EFDDDDF2E0DFEFDDDD
+ EBDBDAEDDCDBEEDCDCEDDBDBE9D7D7E4D1D0EED9D8706565A79897B4A2A11110
+ 0F000000342F2EB7A4A3F8DEDDF1D8D6E8D0CEF1D6D5E2C8C7E5CBC9F3D8D7F1
+ D6D5E9CECCE9CDCCEDD1CFEDD0CFEED1CFF1D2D0867474CCB2B11411112A2424
+ F3D2D0E3C1BFE1BFBDE3C1BFF4D1CFF7D1CF6D5D5C2F2727F5CFCDF5CECBE5BF
+ BD7C6867D0B0AC0F0C0C241E1EEBC3C0EEC5C3E9BFBDEBC0BEEDC1BEF1C3C0E7
+ B9B62A20209F7D7AFCC3C0EEB4B0F1B3AFF4B2AEF2ACA8F2A9A3FBADA76C4946
+ D78E885F3E3C000000B4746EFFABA2FF9E94FFA99DFFCEC3FFF7F0FFFFFDFFFE
+ FBFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFCF5FFF3E9FFCBBEFFBFB6FF
+ C9BEEEA39A6B4642E9968F160E0D18100FE8A39EFAB8B2F7BBB5F5BCB8F3BEB9
+ F5C2BED1A7A4927674A6878400000076605FFED0CCECC2BFEDC4C1EFC7C4E9C2
+ C0E4BEBBF1CBC96E5C5CB69A99151212110E0FD8B8B5F0CECBEBCAC8F1D1CFF3
+ D4D2F1D2D1EBCCCAE8CBC8E2C5C3DFC3C1E3C8C6E7CCCAAC9897AC9A997F7171
+ 0000009A8988FDE3E2F0D9D7EAD2D1ECD5D3EED8D7EDD7D6EFD9D8ECD6D6E7D2
+ D1E7D2D2E8D4D3E8D5D5EAD6D6EDDADAF7E3E2716868C9B9B87A70700000006D
+ 6564FAE7E6E5D1D1F1DDDCEFDBDBE9D6D6E9D6D5EBD8D7ECD8D7EAD7D6EFDDDC
+ EBD8D8EDDBDAEFDDDDFBE9E87A7170000000726868F2DFDFDFCECDE7D6D5E3D2
+ D2DECDCDE3D2D2E8D7D6E6D4D3E0CFCEE5D4D4EBDADAEBDAD9E0CECEDCCAC9E8
+ D3D3AE9E9D7B6F6FC2AFAE0B0909000000625857DBC4C3EED5D4EED6D5DFC7C5
+ D8C0BEEBD1D0E0C6C5D7BDBCE8CDCCE4CAC9E7CDCBE8CCCBE1C6C3E1C4C2E7CA
+ C8D8BEBC867473B49C9B000000615352F7D5D3EECDCBEAC9C7D7B6B4EAC9C6F5
+ D2D0C2A6A4040403BCA09EFFDEDB9D8482A68D8C84706E000000887170F5CAC9
+ EAC0BFEDC2BFE9BCBAE8B9B6EDBCB9F8C1BE574241574241F7BBB7ECB0ACF0B0
+ ACECAAA6ECA8A3EDA7A1FFB6B19D6E6B9E6D6AA4716C000000885551FF9D94FD
+ 9D93FFC3B9FFE2D8FFE9E2FFDDCFFFF4E8FFFFFFFFFFFDFFFFFFFFFFFFFFFFFC
+ FFFFFFFFF1E8FFE0D1FFCDC0FFAFA5FF988ECC87807C5D59D09690000000573C
+ 3AF9ACA6F6AEA8F6B0ACF6B4AFF0B3AFF0B7B3D0A29F927572A5848200000072
+ 5D5BFDD0CDE9BEBCE6BEBBECC5C2EEC7C4DDB8B5EFC9C6877170A088865F5150
+ 0000009D8584F1CFCDEDCDCAE4C4C3EACAC8F0D2CFE3C4C3ECCDCCE5C8C6E1C4
+ C3EBCECDEFD2D0A69090AA96967D706F000000948484F0D6D5ECD5D5EDD6D5E4
+ CDCCE7D0CFEAD4D3E1CCCBEAD5D5E7D3D1E4CFCFE1CECEE8D4D4E7D4D3E6D3D4
+ DBC7C75D5454E0CECE373232000000988B8BE9D5D4DBC9C8E8D5D5DFCCCBE1CE
+ CDE8D5D4E7D4D3EEDBDBE1CFCEDFCECDEAD8D8EBD9D8E1D0D0F2E0DF766D6C00
+ 0000797070EFDDDCDCCBCADECDCCDDCCCBE3D1D0DCCBCBDFCECEDDCBCBE3D1D1
+ D9C8C7EAD9D9EDDCDBDDCBCADCC7C6F0DADA726766C5B3B24A43430000007D72
+ 70E5CDCBEAD2D1E9D1D0DEC6C5DFC7C5DFC6C5E2C9C7E5CBC9DAC1BFE5CBCAD7
+ BDBBE4CAC8DAC0BEDEC2C0D2B5B3EBCECDB19C9BA28D8C7D6D6C0000009C8886
+ E5C5C3DBBBBADDBEBCE5C6C4F4D4D2F5D4D2F4D1CF372F2E554847EBC5C36353
+ 51CAAAA71D1817120F0FD6B0AEE9BEBCECC1BFE8BBB8E5B6B3EABAB8E5B3B0F7
+ C1BE9D7977261D1CE0A9A5F0B4B1EBAEABEEB1ACEBACA7EBACA7FBB7B2DD9E99
+ 5E423FDC928D100808382321FDB5ADFEBDB4FFB7ADFFC7BEFFB3A8FFC0B2FFF0
+ E4FFFCF8FFF0E6FFF9EFFFFDF9FFF6EDFFF3E7FFE8DEFFC1B3FFB1A6FFA69CFF
+ B1A7965752AF69648D5F5A000000B08480FBB6B0F5B3AEF7B7B2F2B3AEECAFAA
+ F2B5B1CB98958F6E6CA37E7C000000725C5AFFD0CDE5BAB7ECC2BFE4BCB9F3CB
+ C9E2BCBAF4CDCB8D76759E868483706F0000006B5A59F3D0CEE4C4C3E1C2C0E1
+ C2C0E9CAC9E2C4C3E5C7C5E5C9C7E1C5C4E1C4C3E1C4C3B09A99B09C9A807271
+ 0000008E7E7EEDD3D3DCC5C4E8D0D0D9C2C0E4CDCDE2CBCBDEC8C7EAD5D5E0CC
+ CBD9C4C4E2CECEE4D1D1DCC8C8E9D5D4A597977F7474C3B3B2020202120F0FD2
+ C0C0E9D5D5D9C6C5EBD8D7D4C1C0D9C5C4EDDAD9E6D3D2DFCDCDD7C6C5E5D4D3
+ DFCDCDE1CFCEDECDCCEDDAD9675E5E0000007A7271F0DFDEE4D3D3E4D2D2E1D0
+ CFEAD9D8DBC9C8DECCCCE5D3D3F0DFDFD8C7C6EBD8D9F6E3E2E2CECDE1CCCCE8
+ D3D2766A6ABCAAAA030203413A3AE8D2D0DFC8C7DEC7C5EAD3D2DBC4C2E4CCCB
+ E7CECDDEC6C5E2C9C9E0C6C5EBD1CFDBC2C0ECD2D1DBC1BFEACFCED6BBB9EED2
+ D0857674C1A9A83F3837040404D3B8B6DDBEBCD8B9B7EFD0CDE7C6C4E9C8C6F5
+ D4D1FBD6D4917977100D0D715E5D927A78987F7E000000766261F4C9C6E4BAB7
+ ECC0BEE8BBB8E7B9B6F1C1BFE5B5B2EFBCBAD6A6A31D1716B88D8AF5BCB8EAB2
+ AEF0B7B3EDB0ACECADA8F4AFAAFEB0AA784F4CA16C68805B58000000C8918AFF
+ B9AFFCAFA5FF948AFF968BFFBFB4FFE2D5FFD3C6FFC0B1FFD2C5FFE5DCFFDACB
+ FFCABCFFD6CAFFC3B8FFA298FF9D93F99C93614441DB928B2A1816392322F7AE
+ A8F0B7B1F3BCB6F6BBB6ECB0ACEDB3AFF8BEBACB9B978E6D6BA27D7B00000073
+ 5A59FECAC7E5B8B6F0C5C2E4BBB8EEC7C4E4BEBCF9D2D08D7676B09493806D6B
+ 000000716160F4D2D0E2C3C2E1C3C1E2C4C2E4C7C5E2C5C3E2C4C3E4C8C6E1C6
+ C4E0C5C3F0D3D2B4A09FAC9897807271000000938483F8E0DFDDC6C5EAD2D2DC
+ C5C4EAD4D4DFCAC9E3CECDF0DBDBE5D1D0DCC9C8E1CDCCE9D5D4DFCBCBE8D4D4
+ 655D5DCEBDBC5852520000006E6464ECD9D9EBD7D7DECAC9E7D3D2DAC6C6DAC7
+ C6E7D5D4E9D7D6DAC9C8D9C7C6EFDDDCDAC8C8DCCBCAE6D4D3F2DFDE665D5C00
+ 0000706867E9D8D7DECDCCEAD9D9E0CFCEDDCCCBE6D5D3DAC9C7E2D0D0E8D7D6
+ D8C7C6EFDCDBF2DEDDDFCBCADAC5C4E3CECD7B6F6F9A8C8B000101948685E9D3
+ D1DDC7C6D8C2C1E3CDCCDBC6C4EAD3D3E5CFCEDEC7C7E2CBC9CDB8B7E0C9C7D9
+ C0BEF0D6D4DEC3C1DEC3C1DCC0BEDFC4C2726362BAA1A00504042F2828DCBFBC
+ E6C7C5E1C1BFE3C2C0DCBBB9E8C6C4F6D4D1EFCBC8D7B3B1221D1C171414CEAC
+ AA2D2625080707CEAAA8EFC5C2E2B9B7E5BBB9E5BAB7E8BBB8EDBFBCE4B5B2E8
+ B8B5ECBAB73F3231775C5AFDC5C0EEB6B2EDB2AEECAEAAEDAAA6F3A9A5F8ADA8
+ DFA29D54423FC8938E20161546312FFDB2AAFC968DFD8B82FF9D93FFBAB0FFBD
+ B2FFBBAEFFB3A6FFB2A7FFEDE5FFD1C5FFB4A8FFAFA5FFBFB5FEA299FFA299A7
+ 6C66855350A16D68000101BD817CFBA39DF0A19CF4B3AEF4BEB9EBB8B3EBB5B1
+ F6BDBAC7989591716FA37F7C000000765F5DFDCBC8E8BAB7EFC1BFE5BAB7EAC0
+ BEE4BCBAF9D1CF715F5EC9A9A84D42410000009F8886F0CFCEEACBCBE1C3C2DF
+ C2C0E6CAC9E1C5C4E0C3C1DFC2C1E1C5C4E3C8C6E9CDCB897978A08E8D827373
+ 0000008A7B7AEED6D5E4CDCDE6D0D0DCC7C7E4CECEDDC9C7E3CFCFEFDADAEBD8
+ D8E0CDCEE1CDCDE1CDCDEFD9D9938685857979A395950000001D1B1AD1BFBFE0
+ CECED8C4C4DECACADAC6C6DCC9C8DBC9C7E2D0CFEBD9D8E9D7D7DBC8C7DECCCB
+ D9C8C7E2D0CFDECCCAEDD9D96F6666000000766E6DFBE9E8EFDEDEEEDDDCEAD9
+ D8E8D7D6F0DFDEEBD9D8EEDDDDEEDCDCE7D5D5E9D6D6EBD7D6EFDBDAE8D3D2EE
+ D9D8887D7C9B8F8E0B0B0AAD9D9CF1DAD8E7D0CFDFC8C8E5D0CFE3CECDEBD6D4
+ E9D4D3E9D3D2F7DEDE918483D2BCBBEED4D3F1D8D6E8CDCBE3C7C5E9CDCBB59F
+ 9E8B7A799D89880000005D5150F8D7D6F1D1D0EACAC8E4C4C3E8C8C5EECCCAF1
+ CECCF1CECBF8D1CF715F5F3F3535A88E8C00000060504FF8CFCDF1CAC7EAC2BF
+ EAC0BEEBBFBEEDC1BFEEC1BFEDC0BEEFC1BEFFCECB695452312524F6BFBBEFB6
+ B2F0B3AFF2B0ACF1ADA9F0B3AFF2BBB5FEC3BDBB8B86604341B0807B04040498
+ 5D58FF9D94FC9C93FDA79EFFB1A6FFA79CFF948AFF9E93FFA69BFFD6CCFFABA0
+ FF9F95FE9C92FDAAA0FFB8AFE6968E4F302EC1837D0F0707775350FFBAB3F4B0
+ AAF4ACA6F5AAA5F4ACA8EBAEAAECBAB6FAC9C5AD88858B6E6CA9868300000075
+ 5E5DFFD3D1F3C8C5F0C7C4EFC6C4F0C7C5FACFCDD0ADAB6F5D5CDCB9B70C0A0A
+ 1E1A19E4C3C2EBCBC9EBCDCCEBCDCDE7CAC9EED1D0ECD0CFEBCFCEEBCECEECCF
+ CDE8CCCBECD1CF8C7C7BA1908F807372000000786D6CFDE5E5F0D9D8EED7D6EF
+ D9D9EFDAD9E8D4D3E5D0CFEBD8D8E6D3D3E9D6D6EFDBDBFBE6E6B0A1A06E6665
+ C8B7B6161414070606B6A8A7F6E2E1EBD7D6E8D4D3ECD9D8EBD8D7E7D4D3E6D5
+ D4E8D6D5E5D3D2EBDAD9E9D7D6EBD9D8F1DFDEEDDBDAE7D5D4FDEBEA776E6D00
+ 0000776E6EF8E7E6EDDCDBECDCDAEADAD8EBDBDAE7D6D5E9D7D7EFDEDEF2E1E1
+ ECDAD9E8D5D4E7D3D2EAD7D6EBD7D6EAD6D5B6A6A6877C7A3A3434796D6DF5DE
+ DDEBD4D2EBD5D5EBD5D4E6D0CFE5CFCEE3CCCCE5CECDEFD7D6554C4CCBB4B4ED
+ D3D2EED4D3EBD1D0EFD4D3F4D8D67C6E6DAB96945D5151000000837271FFDEDC
+ EECFCDEFCFCDF0CFCDEFCFCCEDCBC9F2D0CEF3D0CEF4D0CDC6A9A7120F102721
+ 20030303BC9D9CF6CDCBF0C9C7EEC6C4ECC3C0EEC5C2EEC3C1EFC4C2ECBFBCEB
+ BCB9FECBC89E7D7C030202D1A09EF6B8B4EDB0ACF2B8B4F1BDB9F0BBB6F3BAB5
+ F3B3AEFFB8B49D767275524F7E53500E0606AF706BFFACA4FDB1A9FCABA3FE9C
+ 93FE988EFE9C93FF9E94FFAEA5FF9C92FEA79EFC9D94FFA69DEAACA45A3E3BA4
+ 6E694229275B4240FBAAA4F8AEA8F7B6B1F7B8B3F4B4AFF4B2ADEFABA7EAAAA6
+ F2BAB6AD8B888A716FAC8C8A000000544342F6C9C5EFC3C1EEC3C1EFC6C4F4CB
+ C8F0CAC8675756CAA9A7715E5D000000917B7AFBD6D4EBCAC8E8C8C6ECCDCCEF
+ D2D1F1D5D4EFD4D3EDD2D0F0D3D2EFD2D1EBD1CFF4D8D78D7E7DA29191807373
+ 000000786D6CFEE6E5EBD2D2E9D1D0EFD8D7F0D9D8F1DAD9ECD6D6EDD8D7ECD7
+ D7F4DFDEF1DDDC998D8D6C6362C4B4B42B2727050404A59797FCE9E8E9D5D5EC
+ D8D7E8D5D4E6D4D4EBD8D7E8D5D4E6D4D3E7D5D4E1CECEE4D3D1EBD9D9EEDDDB
+ F3E1E0FAE7E6F5E3E2FFF3F2796F6F000000776F6EFEEDEDEBDBDAECDCDAEEDD
+ DDF0E0DEE7D6D6DFCECDE2D1D1E7D5D5E8D5D4EDD9D9EFDBDAEEDAD9F2DDDCF0
+ DCDBEFDADA8B7F7E8074743A3434D9C3C3F7DFDEF1DBDAEAD4D3EFD9D8EBD4D4
+ EAD3D2F4DCDBE0C9C8262222D6BFBEE9D0CEEDD4D4E6CCCBEED3D2E1C8C7544A
+ 49CEB7B61E1A1A0000009F8A89F8D9D6EDCECCECCBCAEECFCCEBCBC9E7C6C4ED
+ CDCAF1D0CEECCAC8EDCAC83D34340000003D3433F1CBC9EFC9C7F1CCCAF1CBC8
+ ECC4C2ECC3C0EDC2BFECC0BEEEC1BEEBBCB9F4C1BDC59A98000000816361FFC7
+ C3F1C0BCF2C1BDF3BEBAF3BCB7F2B3AEF2B4AEF5BAB6FFB8B1A8736F69413E7D
+ 53502D1D1C916662FDAFA8FFAEA6FFA39BFD948BFCA198FC9E96FCA79FFDAAA2
+ FFABA3FFAAA2D48C86684441815F5B47302E644643FAA8A2FCB8B3F5AAA5F5AB
+ A7F4B6B1F5BAB5F6BCB7F4B9B5F1B4B0FEBFBBA07877826765AB8B8800000050
+ 4140FACECBF3C8C6F1C8C6FDD4D2DCB6B4725E5DAB908F8E7876000000675858
+ F6D3D1F2CFCEEECDCBEECDCBE7C6C5E8C8C7EBCDCCEDCFCEE9CDCCF0D4D3EFD4
+ D2EBD1D0F9DDDC6F63629B8B8B827474000000655B5AFEE5E4F3DBDAF1D9D8F1
+ D9D8F1DAD8F2DBDAFAE4E3F7E0DFE2CCCCC0AFAE7C7171817676928685181616
+ 211E1EB7A8A8F8E3E3EDDBD9E5D2D1E6D2D1E5D2D1E0CDCDE6D3D2E8D5D5E4D1
+ D0E7D5D4E4D2D1EAD8D7E7D5D4EAD7D7EAD8D7F0DDDCF5E3E2FEEFEF776E6E00
+ 0000736A6AF7E5E5DAC8C8E7D7D6EDDCDCEEDEDCEEDDDCE8D6D6DAC8C8D7C3C2
+ EBD8D7E8D5D3EEDAD9E9D6D4EEDAD9EDD9D8F3DFDEDFCBC9897C7B665C5C6258
+ 58CBB8B7F1DBDBE4CDCBF8E0DFE8D0CFEAD2D0EAD3D28074730B090ADFC9C8F1
+ D8D7F0D7D6F4D9D8FFE8E7A290906F6262BCA7A6000000000000BFA8A7FFE0DE
+ F5D5D4F2D3D1F3D2D0EECFCCEBCAC9EECDCBF0CFCDEFCECCFAD6D48673720000
+ 00957E7DF8D2CFE6C0BEEDC6C5F0C8C5EFC6C3F1C7C5EFC4C2E6B9B6EDBCB9F1
+ BEBBF6C0BCE5B1AE050404282020F7C7C4FECAC6F7C2BEF2BCB7F0B4AFEFB7B1
+ F1B7B2F3AFAAEDA39EFFA9A3D08F8A805653714E4B493432664744B57873EB98
+ 91FD9A92FFACA4FFABA3FFB2AAF3A49CDA928B9A646051363462403E513B3999
+ 706CFFB7B1FBAFA9F7ABA5F7BAB5EFAAA6EBA7A2F2B7B3F6BEBAF6BEBAF6BCB8
+ FFC4C08768667F6260AE88850000002C2524DDBBB9E1BDBBD5B1B0A68C8B7361
+ 608D7876564848010101715F5EFAD6D4F7D4D2F2D2D0EECECDECCCCBE9CAC8E8
+ C8C7EDCECDEED0CFEBCECDF3D7D6F6DAD8F8DCDBFFEDEC685D5CA594938B7C7C
+ 000000342E2EC5B2B1E0CBCAE8D1D0E7D1CFDDC9C7D2BEBEC8B6B6978A896D62
+ 62635A5A665D5D474141201E1E796E6DCEBBBAF8E3E3F0DDDDE9D6D5E9D7D6E8
+ D5D5E7D4D4E3D0CFE3D0CFE7D4D3E4D0CFE6D3D2E1CFCEE8D5D5DCC9C9DFCDCD
+ E2D1D1DECCCCF4E4E3FCECEB746B6A000000766D6DF9E7E5D6C4C4E7D5D4E0CF
+ CFDFCECDE2D0D0EAD8D7D7C4C3DAC6C5EBD8D7D8C5C4E0CDCCE5D1CFE5D2D1DB
+ C7C6E9D5D4ECD6D5D5BFBD9C8C8B605656534B4B8276768B7C7C8E81806E6261
+ 5047471A1717000000020201CFB9B7E7CFCED9C3C2A794948576752E29294840
+ 3F4941400303030404045046467B6C6B998584AF9896CCB1AFDCBCBAE1C1C0E3
+ C3C2E0C0BEE7C7C5E9C8C6BEA2A01F1A1ADCBCBAF2CDCAEAC4C1EAC3C0E4BDBA
+ E5BDBAE2B7B4EABDBAD5A9A7B8908EA2807E8E706E6F58560F0C0C0202026551
+ 4F997977BA908EECB5B1F1BEBAECB5B1EBABA6EEAAA5EB9D99EDA39EF6ABA6F1
+ A59FB886818A615D6346424A312F5539366A413D724A47734B476D4D4A62423F
+ 4C34325238366342408C605CDF9791FFC0BAFAB3ADEFADA8EFA8A3EEA7A3EDB5
+ B0EBABA8F1AFABE5AEAAC399969676736F56542E242430252540323104030306
+ 040413100F2D26254A3F3E4E4342504342372E2D4C403FB39795F3CFCDEDCAC8
+ E1BFBDEECCCAF1D0CFECCDCBE1C3C1EBCDCCE8CAC9E9CDCBE6CAC9CDB4B3AB95
+ 94917F7F7A6C6C201D1C554C4C463F3F0404040202020A09091211112F2A2A55
+ 4D4C3D3737342F2F3631313F39393731304841415950508B7E7DDCC8C8FBE4E4
+ DAC5C4E5D1D0E2CFCEDAC5C4DCC8C7E5D2D1D9C6C5D9C6C5E1CECCDECAC9D7C3
+ C2E4D1D0D7C4C5E4D2D1E1D0CFDFCFCEE1D0CFD6C5C4E9D8D7EEDCDB6C636200
+ 0000776E6EF2E0DFD4C3C2E0CFCED9C7C7DDCBCAEAD8D7E8D6D5D7C4C3DAC6C5
+ E4D1D0D8C4C3EEDAD9E4D0CFD9C6C5D6C2C1EBD7D7E3CDCCDAC4C1FAE2E0DEC9
+ C8B0A09F8F82828779788377766F64628B7E7D9284839081818B7D7CD6C0BEEE
+ D5D5DDC6C5B29F9DA39190BDA8A7B39E9DB29E9DB5A09FC1AAA9AD97969D8988
+ AA9493BCA4A2C4ABAAD6B8B7EDCFCDEACBCADFC0BEE0C0BFE3C2C0E6C4C3B49A
+ 99EECAC8EDC8C6ECC7C4E5BFBCE3BBB9EBC1BFDDB1AFEDC0BDCCA4A2BB9795AE
+ 8D8BAC8E8CAD8E8DBB9896BD9A97A98684B08886BC9391DEB1AEECB7B4EDB1AD
+ EBADA9ECA4A0ECA6A1EFACA7ECA39EF0AEA9F8B2ACF1ACA6DB9892BE817C8D5D
+ 5A8658544E3533412A296B4D4A885F5CA67470CD908BEEA29DFAADA7FAACA7EE
+ ABA5F1B7B1EDA8A3F5B9B4EBA6A1ECABA6EBB4B0F3B7B3D09794B88B88AF8886
+ AE8A88B89491B69290AE8B88BE9895C09A98B18C8AC29D9BBB9897AF9392C3A8
+ A6DCBCBBF2CFCDEAC5C3EFCCCBE2BFBEDCBAB8EECECCF2D3D1ECCCCBDEBEBDE1
+ C3C2E4C8C6EDD1D0DFC4C4C9B2B2B49E9DAB9796A28F8EB09C9BB09D9CB2A09F
+ B8A3A3B4A09FB6A3A2AF9E9DBAA7A7AF9C9BC2AFAEC1AFAEB1A1A0B6A4A3C7B3
+ B2E2CDCCE5CFCEEDD8D6FAE4E3EDD7D6D6C1C0E3CFCEE0CCCBDEC9C7E5D1D0E7
+ D2D1D4BFBED8C3C2E3CFCED4C1C0D4C0BFE4D0CFD4C1BFE2D0CFE2D1D0E0CFCF
+ E3D1D0DBCAC9F0DEDEE9D6D56F6766000000736B6BE9D7D6E8D6D5D7C5C4DAC8
+ C7DBC9C8E5D3D3DDCBCAE3D0CFE4D1CFDCC8C7DCC8C7E6D1D0E0CDCBD9C6C5DF
+ CBCAE2CECCDBC6C5A89897736969988A8AD6C3C2F2DDDCE7D1CFE1CBC9897B79
+ 978887DFC8C7EBD2D2F0D7D6E0C8C7B7A4A3786C6BAF9C9BD5BEBD887A798374
+ 74AA9795A491908676759D8A89ECCFCEE5C8C6F1D3D2F0D2D1DDBFBDE4C7C5E7
+ C9C7E0C1BFDDBCBADFBDBBEDCBC9F2CFCEE9C7C5EDCAC8E9C4C1E2BBB9E3BAB8
+ ECC1C0DDB3B1E5BBB9E5BCB9EBC2BFE9BFBCEFC3C0EFC3C0F1C7C3F8C9C6EFBC
+ B9F0BFBCF1C3C0EAB6B2EAB2AEEDB3B0E9A7A3ECAAA5ECAEAAF0ABA7EDABA6EF
+ B1ACEDAAA5EEACA6F4A8A2FFB4AEFCA69FFCABA4F2A59FF6A39DF9B4AEFFB6AF
+ FAADA7FBB2ACF9B0AAECA29DF3AEA9ECA49FEEB6B1EBB1ACF2B2ADEAB1ACF0AF
+ AAE9ABA7F1BDB9EAB3AFECB0ACFAC2BFFBC7C4FACAC7F8C8C5EDBEBCF0C2BFF6
+ C7C5EDBEBCF3C4C2ECC0BEF0C4C3ECC4C2E7C4C2E8C9C7E2C4C3E9C9C7E2C0BE
+ E3C1C0E6C6C3F4D6D4EED0CEDDBEBDDFC1BFE3C5C4EED1D0E0C5C4EFD3D2E8CC
+ CBEBD1D0E6CBCAEED4D3F7DEDDF2DAD9ECD3D2E8CFCEF1D8D6E7CECDF2D9D7E1
+ C8C7F3DAD9F7E0DFECD5D4E2CCCCE2CCCBDFCAC9DFCAC8DCC7C6E7D1CFDDC7C6
+ E2CCCBD8C3C2DDC8C6DEC8C7E1CCCBDAC6C4DBC6C5DAC5C4DECAC8D5C2C0DBC7
+ C5DFCBCAD5C1C0DFCCCCDBC9C8DECBCAE0CECDD9C7C6E7D6D5E3D0CF6C636200
+ 00006C6464E9D7D7EDDDDCDCCBCADECDCCDECCCBE1CFCEDCCAC9E2CFCFE8D5D5
+ D8C4C4DAC6C6DECACADAC6C6DFCBCAE5D2D1DECAC9DECAC9DAC8C73935359286
+ 86E5D2D1E0CCCBE5D0CFEDD7D6544C4B766B6BE7D0CFE1CACAE4CDCCE3CCCCCD
+ B8B7221F1FBCA8A7EDD4D35149486C605FD6BEBDCFB7B6C1ABAA635858CFB7B6
+ E3C8C7E9CDCCEBCDCBE2C4C2DFC0BFE3C4C2E3C4C1E8C8C6DFBEBCE8C7C5EBCA
+ C8E9C6C4E8C4C2E3BDBAE0B9B6E0B9B6E6BFBDE4BDBBE6C1BFE4BEBBF0C8C6ED
+ C3C0E6BDBAE8BFBDEBBFBCEEBFBCEBBEBCEABFBCE9B7B4EBB5B2EEB7B3ECAEAB
+ ECACA8EEB3AFF1B2AEEBAAA6EEB4AFF2B3AEEEAFAAEFADA7EDA5A0F5B0AAF4A4
+ 9EF0A7A1F1A7A1F9ACA6F5B4AEF1AFA9F2ACA6F6B3ADF6B3AEF1A9A4F2B0ABED
+ A9A4F2B3AEF0BEB9ECAFABEBAFABF0B9B5E9AAA7E9AFABEEBDB9EEBBB7E9B1AE
+ E8B3B0F0C1BDF2C4C1E9BCBAE7BDBBE9BFBCE8BEBCE7BDBAE4BBB9E8C0BEE8C0
+ BFE5BEBDE9C5C3E7C6C5E6C9C8E9CBCAE7C9C7E7C7C5EFCFCDEDCECDDFC2C0E4
+ C7C6E0C3C2E9CDCBE9CDCCE2C6C6E4C9C8E9CFCEE3C9C8EAD1D0ECD4D3E5CECE
+ E4CCCCE0C9C8EBD3D2E5CECDE3CAC9E3CACAEDD5D4EED7D6E0CAC9E9D2D2EDD7
+ D6E4CECDE6D1D0E0CAC9E3CDCCE2CDCCE3CDCCD8C2C1DFC9C8DAC5C3DBC6C5DB
+ C7C5E5D0CFDEC9C8DFCBCAE0CCCBE3D0CFE2CECDDECACAE0CDCDE1CFCFE6D4D3
+ DDCACAE5D3D2EEDDDCEEDBDA756C6C000000746C6BF7E5E5E9D9D8E7D6D6E9D8
+ D7EDDBDAF1DFDEF2E0DFF1DDDDF4E1E1EAD6D6ECD9D8F2DFDEEEDBD9EEDBDAEA
+ D7D6E9D7D6E9D7D6EDDADA585152AEA1A0F2E0DFE5D2D2EAD7D7F9E3E36E6564
+ 8A7E7EF4DCDCE2CCCBE2CCCBECD5D5E6D0CE403A3AD4BEBEFCE1E17065648779
+ 77F7DDDCE8CECDF4D9D7D3BCBBD7BFBEE8CCCBEDD0CEF1D3D1F5D6D4F2D3D2ED
+ CECCEECFCDEBCBC9E6C5C3EDCCC9EBC8C6EBC7C6EBC5C4E8C3C0EDC8C5EDC8C5
+ EFCBC9EFCCCAF1CCCBF0C9C7F0C8C6EFC8C5EFC6C3EEC1BFEEC1BFEAC1BEEAC1
+ BEECBBB8EFBCB9F1BEBAEFB6B2EFB3AFF0B7B3EDB2AFF2B4B0F2B9B5F1B9B5F3
+ B5B0F4B8B3F5B3AEF6B1ACF8B4AFF9ADA7F8B3ADF5ADA7F7ADA7F6B7B1F8BAB4
+ F8B3AEF5B4AFF2B1ACF2AEAAF4B3AEF4B6B1F4B3AFF5BEB9F3C1BCF2B6B2F4BD
+ BAF4BEBBF6BAB6F6BFBBEABBB7E9B9B5EDB9B6F2BFBCF6C7C5F1C4C1F1C7C4F3
+ C9C7EEC5C3F3CCC9EEC6C5EFC8C6F3CCCAF1CBC9EFCAC9EDC8C7EFCCCBF2D3D1
+ EED1CFF2D7D4EDD0CEEFD1CFF1D3D2EFD1D0F1D4D2EACECCEED2D1EACFCEE8CD
+ CCE5CBC9EAD0CFECD3D2EDD4D3E6CECDEED6D5EAD3D2EBD3D2EDD5D4F0D7D6F0
+ D6D6EBD3D1EFD7D6F1DAD9F0DAD9EFD8D7F4DDDCF7DFDFF4DDDCF1DBDAF3DDDC
+ EFD8D7EFD8D7F0DAD8EAD5D4E7D1CFEAD5D4EAD6D5E2CDCDE9D4D4E3CFCEE9D5
+ D4EAD7D6E7D5D4EDDBDAEEDCDCF4E3E2EDDCDBEFDEDEEEDDDDF9E7E778707000
+ 0000756D6DFEEDEBE7D6D6E5D4D4E5D3D2E4D0D0E6D4D3E4D2D1EAD7D6E8D6D4
+ E3D0D0E4D1D0E5D3D2E7D4D3EBD9D8EAD8D8E8D7D6EAD8D7EDDBDB575051AA9D
+ 9DEFDDDCE6D4D3E9D6D6F7E2E16D63638F8282FFEBEBF2DCDBF1DAD9F3DBDAED
+ D6D5403939CCB7B6F8DFDD6C6161897B7BF9DFDEF2D7D7D1BBB9E4CBCAEDD2D1
+ E7CCCBECCFCEF0D2D1EDCFCDEDCFCEE6C8C7ECCCCBECCCCAE6C4C3E8C7C5EBC8
+ C7EBC8C6EECBC9EAC7C5EBC9C7E7C5C3E9C6C4E9C5C2ECC7C5EDC7C5ECC5C3E7
+ BEBCEBBFBDEBC1BEEEC7C4EEC4C2EDBEBBECBDBAEEBEBBF1BBB8EFB6B3F0BAB6
+ F0B9B6EEB3AFF0B6B2F2BEBAF2B8B4F1B9B4F2B6B2F5B3AEF4B3AFF3AFABF5AC
+ A6F8B7B2F2ACA7F3AEA9F0B1ACF4B8B2F3B0ABF6B8B3F1B1ACF2B4AFF2B1ADF2
+ B7B3F3B5B2F5BAB6F2C2BEEDB9B5F2BAB6F0BDB9F1BEBBF3BAB7ECB8B5E9BCB8
+ E9BCB9EEBDBAF5C4C0F2C4C2F3C9C6F2C9C6ECC4C3F2CCCAF0CAC8EDC7C6EFCA
+ C8F0CACAEFCBCAEDC9C8EECAC9F0CCCBEECCCBF0D2CFEFD4D2EFD4D2F1D7D6EF
+ D3D1F1D5D3EED1D0EBCFCEF1D5D3EDD3D2E5CBCAEBD1D0EED5D4EED6D5EBD3D2
+ EFD7D5ECD4D2E4CAC9EAD0CFE8CFCDE7CECCE2C9C7E6CECEE9D2D2EBD4D3E4CD
+ CCE8D2D1EFD9D8EDD6D5E6D0CFE6D0CFE7D1CFE6D0CFE7D0CFE9D3D2E3CECDE2
+ CDCCE5D1D0E3CECCE7D2D1E3CFCEE9D6D5E8D5D4DFCDCCEBD9D8E7D6D5EDDCDB
+ EFDEDDF1E0DFF0E0E0FEEDED766E6D000000766E6EFFF0EFEEDCDCE7D6D5E9D6
+ D5E2CDCCE3D0CFDECCCBEAD7D7EEDCDAE8D5D4E9D7D6E8D6D5EAD8D7E7D6D6E7
+ D6D5E1CFCEE7D4D4ECDADA565050A99C9CF0DDDDE6D3D3E7D4D3F7E1E1706666
+ 4B44448A7D7D8478788477778376757D7170292424CFBBBAF7DFDE6F64645950
+ 50AA9898A392914B4343D0BAB9ECD3D2E8CECDE7CCCBEDD1D0ECCFCEEED0CFEA
+ CBCAEFCFCEEECECDEBCBC9E7C5C5EAC9C8EAC8C7EBCAC9EECECDEDCDCBEBC9C7
+ EAC7C5EAC6C4EECAC8ECC7C5F0C8C7EFC6C3EFC7C5F0CBC9F1C8C6EEC2BFE9BC
+ BAECBEBBECB9B7ECB6B3EDB9B6F0BDBBF0B9B5EFB8B4F1BDBAF1BCB8F2BAB6F5
+ BEBAF6BBB7F7B7B3F8BCB8F5B2AEF2AEA9F6B9B5F4B1ADF2B0ACEDB2ADF1B9B4
+ F4B5B1F5B9B4F5B8B4F2B8B3F0B2ADEEB4B0F0B7B3F1B6B3F2BEBAF1C4C1F0BC
+ B9EEBAB6F1C2BEEEBCBAEFBAB8F3C2C0F0C5C3EDC3C0EFC1BEEEBFBDEEC3C1EE
+ C6C4E9C2C0EBC6C4EDC9C7EBC7C6EDCAC8EDCAC9EDCBC9E8C6C5EAC8C7EECCCC
+ ECCBCAECCBCAEDCDCCEDD0CEECD2D0E7CECDF0D6D5EED4D3EBD0CFF3D6D4F4D8
+ D6EDD1D0E2C8C7E6CCCBEED6D5EAD1D0EED4D3ECD3D1E9CECDEDD3D2EBD2D1EE
+ D5D4ECD4D2EFD7D6EDD7D5EED8D7E8D1D1E6D0CFECD7D6EED8D7EAD5D4E8D2D1
+ E9D2D1EBD5D3EDD6D5EDD6D5EAD4D3E6D2D0E5D0CFE3CECCE8D5D3E6D3D2E6D4
+ D2E8D5D5E3D1D0EBDAD9E8D8D7EBDBDAEDDCDCF0DFDFF2E2E1FFF0F079717100
+ 0000746C6BFAE8E7E6D5D4E9D7D6EFDAD9F1DDDCEEDBDAE7D4D4F2DFDEEEDCDB
+ E3D1D0E8D6D5E9D7D6E6D3D3E9D7D6E7D5D4D9C7C7E4D2D2EAD7D6564F4FA79A
+ 9AEAD7D7E2CFCFE2CFCFF5DFDF6E6564766C6BD4C1C0C4B1B0CAB7B6C8B5B4BD
+ ABAB363130C7B4B3F7DFDE6E6362796C6CDEC7C6D7C0BF9D8D8CD6BFBEE9CFCE
+ E8CDCDE0C4C3E6CAC9E3C6C6ECCECDE4C5C3E7C8C6E7C8C6ECCCCBE7C8C6E6C7
+ C5E8C9C7E9C9C7E8C9C7ECCBC9E9C6C5ECCBC9EAC8C7ECC8C5EAC4C2EDC7C4EA
+ C4C2EECAC7EDC4C2EDC1BEEDC1BFEBBFBCECBCB9EDBAB8EEBCB9EFBEBBEBB7B4
+ EBB5B3F1BDBAF0BFBDF2BCB8EFBAB7EFB9B4F4BBB6F1B4B0EEB5B1F2B2ADF3B2
+ AEF4BBB7F4B4AFF4B5B1F1B7B3EDB8B3F2B6B2F4B9B5F2B9B5F0B7B3EEB4B0EF
+ B4B1F3BDB9F5BDB9F0B9B5F2C5C2F2C5C3F0BEBBF2C2BEEDC1BFEDBDBBF4C1BE
+ F0C2BFEDC3C0F2C9C6F0C5C2F0C4C2F0C7C5EEC7C5ECC7C5EDC9C7E7C5C3EBC9
+ C8E9C6C5E9C9C7DFBEBDE7C6C5EECECDE5C5C4EAC9C9E7C8C7E6C8C7E1C5C4E0
+ C5C5EBD1D0EED6D6EAD2D1EED5D4F0D6D5E9CECCEBD0CFDCC2C1E4CBC9E1C8C6
+ E9CFCEE3CAC8DFC7C5E7CFCCE4CBC9E5CCCAE2CAC9E5CDCBEFD7D5E8D1D0EBD4
+ D3E7D1D1EDD7D6EBD6D5E7D1D0E6CFCFE6D0CEE5CECEE6D0CEE6CFCEE9D2D1E4
+ CFCDE4CFCEEAD5D4E3D0CFEBD8D7EBD8D7E6D4D3DCCACAE6D4D4E4D3D2E6D5D5
+ EBDBDAE6D7D6EBDBDAFEF0EF7971710000006E6665E5D3D2E4D2D1DCC8C6D3C0
+ BEEFDBD9D7C5C4DECCCCE6D5D3DDCBCAE4D2D1E8D5D5DFCCCBDECCCBDCCBCAEE
+ DCDBDECCCBE4D1D0E1CFCE524B4AA69999E5D2D2E0CDCDDFCCCCF2DDDD69605F
+ 8A7F7EF1DBDAE2CCCBE2CCCBE4CFCEDCC8C73D3736CBB7B6F7DEDD6E63638173
+ 72EED5D4E0C8C7E9D1D0DCC4C3DFC5C4DDC3C1DCC0BFEBCFCEE7CAC9E9CBC9DD
+ BFBDE2C4C2E4C6C4EFD0CEE1C3C2E2C5C3E2C3C1EECDCBDDBCBAE3C3C1E6C5C4
+ DFBEBCE3BFBDDEB9B7EBC6C4E8C4C2E3BFBDE9C2BFE4BAB8E5BBB8E3B7B5E9BA
+ B8E3B2AFEEBCBAEEC0BDE8B7B4E3B0ADEAB8B4EDBEBBE5B4B0ECB9B5E9B7B3E8
+ B3AFEDB4B0E8AEABEBB2ADEDAEAAE5A7A3EBB3AEEAACA8EBAFAAEEB5B2E7B2AE
+ E8AFABF0B8B4E9B3AFEDB6B2ECB6B2E7ADA9E9B5B1EEB8B5E3ADA9EBB9B6F0C6
+ C3F0C3C0EABAB6E5B7B5E6BBB8EDBEBBE5B6B3E6B9B6EDC5C3E3BDBBE9C0BEF1
+ C7C5EDC5C4F2CCCAE9C5C4E3C0C0E7C5C4E0C0BFEBCCCAE0C1C0E7C8C7ECCDCB
+ DBBBBAE9CAC9E9CCCAE6C9C8E3C6C5E1C4C4E2C6C6E4CBCAE1C9C8E0C9C8E0C9
+ C8E0C8C6EAD0CEDBC3C1DDC4C3E2CAC8E2C9C7DDC4C3DAC1BFE5CCCBDCC3C2DC
+ C4C2D9C1C0DBC3C1EBD4D3DCC5C3E7D0CFDEC8C7E1CBCAD9C4C2E5D0CFE6D0CF
+ D2BDBCE5D0CEF1DBD9EFD9D7E3CDCBD0BAB9DBC5C4DAC6C4DCC9C7DCC8C7EEDB
+ DADBC8C7DBC9C8DAC9C9E6D5D5E7D6D5EDDDDCD8C9C8D9C8C8ECDAD9766E6D00
+ 0000736A6AE6D2D0F6E2E1E2CECDD9C6C4ECD9D8DAC8C7DECDCCE6D5D4DECCCB
+ EEDCDBE8D5D5D8C5C5EFDDDCE2D1CFC5B5B5BEAEACE8D5D6DECCCC4741419C8F
+ 8FE5D3D3CABABAB1A2A2FDE8E75C5454776D6DE2CBCAEAD5D4E2CDCDDAC4C3D1
+ BCBC2E2A2AC9B6B5F6DDDD615757756867EDD4D3DCC3C2CEB7B6968584E4CBCA
+ E3C8C7DDC2C1EED1D0E6CAC9E1C5C3DFC2C1E9CBCADEC2C0E6CAC9E2C6C4F0D1
+ D0DEBDBBE9C9C7DDBEBBE4C4C2E7C6C4E0BDBBE9C5C3DEBAB8EFCDCAE4C2C0EB
+ C4C2E7BFBCE7BEBCE8BEBBE6B9B7EBBBB9E1B2AFF1C4C2F1C3BFE5B4B2E3B1AE
+ EEC0BCEEC0BDE7B5B2E9B8B5E9B8B4F2BEBAE6AEAAE9B3AFECB3AFF3B7B3EBB2
+ AEEAB3B0EBAFABF1B8B4E9B2AFEFBCB9ECB6B2ECB5B1EBB6B3EFBAB6F1BEBAE8
+ B1ADEEB9B5EDBBB8E2AEABE8B5B1F2C4C1F1C8C5E6B8B6E6B7B4EABFBCEEC4C1
+ E8BAB8EABCB9EBC0BEE2BDBBE4BFBEF0C9C7EEC7C5F4CDCAE7C2C0E6C3C2EECC
+ CBE2C2C0EDCDCCE1C1C0E3C4C3E5C6C5DFC0C0E6C9C8EED1D0E9CDCBE4C7C6E6
+ CAC9EACFCEDFC5C4DEC3C3E9CFCEE6CFCEE3CCCBE4CDCBE1CAC8E4CCCBE1C8C7
+ E0C8C6E3C9C9E1C8C6E0C7C6DDC5C3E0C9C7DBC3C2E1CBC9E9D2D1DAC4C2E4CE
+ CDDAC5C3E3CECCD9C4C2E4CFCEDFCBC9D8C2C1DFCAC9F0DBDAF4DFDDEED9D7D6
+ C1C0EAD5D4D6C3C2E8D6D5D7C4C3E4D2D1D6C3C3EEDCDBDBCBCAE2D2D2EFDFDE
+ E6D6D5D8C8C8EADADAE9D9D86F67670000006A6160DDC9C8E3D0CFDAC7C6D5C3
+ C2DBCAC9DDCCCBDECDCCDECDCDD9C8C7DCCACADFCDCCD7C5C4EFDCDCDFCECDBD
+ AFAE635B59A699989C8F8E696161877B7BA39696807575796F6EDAC8C7655B5A
+ 6B6160C8B3B3E0CBC9DCC7C7DEC8C7AD9B9B504847968786D2BDBC7166657C6F
+ 6EA49291A08D8C877877877776EBD1D0E2C7C6DFC4C3EDD2D1E5CAC9E3C9C8DF
+ C4C3E0C5C4E3C7C6E2C5C4E4C6C4EBCCCADCBDBBDEC0BEE2C3C1E3C1C0E4C0BF
+ E1BEBCE4C1BFDBBAB8EBC9C7DFB9B7E7BFBDE9C1BFE1B9B7E2B8B5E3B5B3E6B8
+ B6DFB4B1F4C8C5F5C6C3E7B6B3DEB0ADE5B9B6E7B9B6E4B4B2E7B9B6E6B4B1E8
+ B5B1E5B0ACEAB7B3E6ADAAE8AEAAF4BDB9E3ADAAE5ABA8F0BAB6E6B0ADE9B9B6
+ E8B5B2E8B3AFE9B7B4E7B4B0EAB8B4E5B2AEEAB5B2E7B6B3EAB8B5E3B1AEEDBD
+ B9F1C7C4E9C0BDE5B7B5E4B7B4E8BFBDE6BDBBE6BBB8E3B8B6EAC2C1E4C0BEE6
+ C3C1EFCAC8EFC8C6E1BCBAE5C1BFE9C8C6DEBEBDE8C8C7E0C1C0E5C7C6DCBFBD
+ E8CBCBDFC4C3ECD0D0ECD0CFE4C8C8E3C8C7E4CAC9E4C9C9E3C8C8DFC4C3DFC5
+ C4E2C9C8E5CDCCDDC6C6DFC8C7DDC5C3DBC3C2E0C8C7E6CECDD7BFBEDFC7C6E9
+ D2D1D8C2C1DCC5C4E2CDCBDAC6C5E7D3D1DCC9C7E0CDCBDAC6C5E4D0CFD9C5C4
+ E4CFCED7C3C2EBD8D7EEDBDAE2D0D0D5C3C3E6D3D4DAC8C7DAC8C8D9C8C7E8D7
+ D6D6C5C5EAD9D9D8C8C8E1D2D1E8D8D8DECFCFD7C8C8E4D5D4E9D9D96C646400
+ 0000706766F0DDDBE2CECDE4D1CFE2D0CEE5D3D2E7D6D5E4D2D2E5D5D4E3D1D0
+ E6D4D3E5D3D2E3D1D0EEDDDCE1CFCEE3D0D0E1CECDE9D7D6DECCCAE8D5D4E2CF
+ CFDDCBCAE2CFCEE1CDCBDFCAC8E0CAC8EAD3D2EAD4D3E4CFCDE8D2D2E5D0CEDB
+ C5C4E6CFCEDFC8C8DFC8C7EBD4D2E3CCCBD9C1C0DEC6C4E8CECCE5CACAE9CFCE
+ E3CAC9E3C9C8EBD2D1EAD1D0E9D0CFE3CACAE6CCCAECCFCEE3C5C4E9CBC9E8CB
+ C9E4C7C5E3C4C2EAC9C7E9C7C5EBC9C7E9C8C7E9C9C7E9C8C5F0CAC8E3BDBBE5
+ BFBDEAC4C1E7BEBBEABFBDECC0BEECC1BFE9BFBCF1C4C2F0C2BFEEC1BEE9BFBC
+ EBC1BDECBEBBEBBEBBECBFBCEBBAB7E9B7B4EEBBB8F2C0BDEEB7B4EFB7B3F7C3
+ BFE4B0ACE7B0ACEFBBB6E5B2AFEDC0BCE9B8B4EAB6B2F0BFBCECBBB8EFBEBBEF
+ BEBBEDB9B6EBBBB8F0C1BEECBCB9EFBFBCEDC1BEEBC4C1EAC1BEEABDBAECC1BF
+ ECC5C2F0C8C6E7BEBBEAC1BFE8C1BFE7C5C2EFCCCAECC8C6E7C2C0E6C1BFECC9
+ C8E8C8C6E8C9C7E8CAC9E8CAC9E4C7C6E7CCCBE8CCCBEDD3D2EFD4D4E4CAC9E2
+ C8C7E2C8C7E1C8C8ECD2D2E5CBCAE5CBCAE8CECDEED4D3E3C9C8E3CAC9E3CBCA
+ E3CCCBE3CCCBE8D1D0D7C0BFE1CAC9ECD5D5E4CECDE2CCCBE5CFCEE7D2D2EAD5
+ D4E3CECEDFCBCAE0CCCBDFCBCAE2CECDE5D1D0DFCCCBE8D6D5E9D7D6E0CECEDF
+ CCCCEEDBDBEFDEDDE1CFCEE7D5D4ECDBDAE1D0D0EEDDDDE1D1D0EADADAEADCDC
+ E2D4D5DCCCCDEFDFDFEBDCDB706969000000776E6DFFF1EFF2E1DFF5E1E0F1DF
+ DDEDDBDAEDDBDAECDBDAEFDDDDEFDDDCF1DFDEEFDEDDF3E1E1F1DFDEECDAD9ED
+ DAD9F4E1E0EFDBDBF2DEDDF3DFDEEBD6D5ECD7D5F2DCDBF1DBDAEBD6D4E7D1D0
+ F0DAD9EDD7D5EAD5D4EED8D8E7D1D1E8D2D1EFD8D7EFD7D6E6CECEEDD4D5EBD3
+ D2EBD2D0EDD3D2EFD4D3E9CFCEE6CDCDE9D1D0E7CECDEAD1D0EAD1D1E9D0CFE2
+ C8C7E0C5C4E2C6C5E4C7C5ECD0CEEFD2D0EED0CEEBCBC9E9C9C8EBCAC9E8C8C6
+ ECCDCBEECCC9EECAC7F4CFCEF1CCCAEBC7C4EDC6C3ECC3C0EEC4C1EDC4C2EEC6
+ C4F2C9C7F2C7C5EFC4C1F2C8C6F1C8C6F2C6C3F4C7C4F0C5C2EFC2BFEFBFBCF0
+ BEBBF0BFBCF2C0BDEEB8B6EFB9B6ECBAB7DFACA8ECB7B4EFBCB9E8B6B3E6BBB8
+ E6B6B3EAB8B5EFC0BEF0C1BEEFC0BDF3C4C0EDBCB9EBBAB9EEC1BFEFC2BFEFC1
+ BEEEC1BEEAC2BFEFC9C7F0C7C4EBBFBDE4BCB9EAC3C1F0C9C7EFC8C6EFC8C6EF
+ CAC8EFCDCCEFCDCCF2D0CFEECBC9F1CDCCF2CFCDF2D3D1F2D4D3EBCECDEED1D0
+ EACFCEEFD4D3E8CECDEAD0CFE9CECEE0C6C6E0C7C6E1C7C7EDD3D3F0D6D5EDD4
+ D3EDD2D1F1D5D3E9CDCCEDD2D1EBD1D0EED5D4EDD6D5DFC9C8D8C3C1E8D2D1EA
+ D4D3EDD7D6F3DDDCEFD9D8F0DCDBEDD9D8EAD6D5E8D4D4E9D5D4E6D3D1E9D6D5
+ E6D2D1E8D6D5E7D4D4E8D6D4EDDADAE3D0CFE7D5D3F1DEDEE5D2D2EAD8D7ECDB
+ DAE4D3D3E5D6D6E9DAD9EADADAE6D8D8EBDEDEDBCCCCE2D3D3EBDBDB766F6E00
+ 00006F6665F3E0DFE9D7D6EBD8D7EDDBD9EFDDDCEDDCDBEBDADAE8D7D6E9D8D7
+ EFDEDDECDADAEDDBDBEFDDDCE3D1D0EAD7D6F1DDDBF0DBD9F6E1DFF7E2E0EED7
+ D6ECD6D4EED7D6EED8D6EBD5D3E9D2D2EED8D7F0DBDAEED8D8EDD8D7E5CFCEE7
+ D0CFE8D1D1EBD4D3E2CAC9E9D1D0ECD4D3E8CFCEE9D0CEF2D8D7E6CECCE9D0CF
+ E9D1D0E8D0CFE9D1D0E9D0CFECD2D1E7CCCBE3C8C7E8CDCBE0C4C2E4C7C5E6C8
+ C6EACBC9EECECCE9CAC8ECCDCCEECFCDEECDCBEBC8C6ECC8C6F3CFCDEFCBC9EA
+ C5C2EAC3C1EAC2C0EDC5C3E9C4C2EAC2C0EDC4C2EDC3C1EEC5C2EEC6C4EBC3C1
+ EBC0BDF4C8C6EFC4C2F0C3C1F0C1BEF0BEBBEEC0BDF1C0BCEFBCB9EFBCB9EFC1
+ BDEBBAB7F3C0BDEFBEBBEFC0BDE7BDBAEBBDBAEDBDBAEDBFBCECBFBCECBEBAED
+ BFBBEDBFBCECBBB8EBBFBDECC1BEEDC1BEECC0BEEBC1BEEEC8C5EFC9C6EFC7C4
+ E8BFBCEFC8C5F2CDCAF4CECBF1C9C7F0C9C8F1CDCBF0CFCDEFCFCEEECECCF2D0
+ CEF3CFCDF2D0CEF2D2D1E8CBCAEACECDEACECDEDD2D1EBD0CFE4CBCAEED4D3E6
+ CDCCE3CAC9E4CAC9E8CECEE9CFCEE9CECDE8CDCCEFD4D3EDD2D0EBD1CFE9CFCE
+ E9D0CFEED6D5E5CECDE5D0CFEED9D8EED9D8ECD7D6EED9D7EAD5D4EED8D7ECD8
+ D7EAD6D5E8D4D3E6D2D2E2CECDE7D3D2E6D3D2E5D4D3E9D6D6E8D6D5ECDAD9F0
+ DCDCEFDDDCF4E1E1EDDCDBF1E0DFF2E0DFECDCDBE4D5D5E6D6D6EDDEDDE4D5D5
+ ECDEDDE8D9D9DBCDCDF7E6E6776F6F000000746B6BFCE9E8EDDBD9E8D6D4E7D5
+ D4E3D1D0E3D2D1EFDEDDEAD9D8EBDAD9F0DFDEEFDEDDEDDCDBF0DDDDE9D7D6EE
+ DBDAF1DBD9F3DDDCE7D1CFDFC9C7D9C3C1E6D1D0E9D3D3E8D3D2E6D1D0E6D0CF
+ EAD4D2EDD8D6E0CAC9E6D1D1EAD4D4EED8D7EDD6D6EED7D6ECD5D4E3CCCBE6CE
+ CDF0D7D6ECD2D1F2D9D8EAD3D2E6CFCDEAD3D2E9D1D0E6CDCDE7CDCCEBD1D0E4
+ CAC9EBD1D0EFD4D3EBCFCDEBCDCCECCDCCE8C9C7E0C2C0E9CCCAE8CBC9EAC9C8
+ EECBC9EAC7C5E9C5C4F1CECCEFCAC8EAC4C3ECC5C3E8C2C0EAC4C2EBC6C3EBC3
+ C1E2BAB7E6BEBDEDC7C5EFC9C6EFC6C4ECC1BFEDC5C2ECC2BFEEC3C0EEC0BDEF
+ C0BEECC0BDEFBEBCF0BFBCEEBEBBF2C5C2F3C2BFEEBEBBEABBB8EEBEBCEAC0BD
+ EBC0BCEABDBAEDBFBCEEC2BFF0C3C0F0C3C0EDC2BEEBBDBAE8BCBAE9BFBDEEC3
+ C1EDC2BFE4B9B7EDC6C4EDCAC7ECC7C4EAC2BFF2CAC8F1CCCAE8C4C1EFCAC8F2
+ CAC9EEC9C6EFCDCAEAC9C7ECCCCBF3D2D0EAC8C6E0BDBBE3C2C0EACBCAECD0CF
+ EED3D1EFD3D2E3C9C7E8CECDF2D9D7F1D8D7EDD4D3E8CFCEF1D7D7F2D8D7EED3
+ D2EBD1CFECD2D0EED3D2E6CCCBE7CECDE2C9C7E5CCCBF0D9D7ECD5D4E9D3D1EF
+ DBDAECD7D6ECD8D7EAD6D5DCC8C7E5D0D0EBD6D5EBD6D6ECD7D7E5D2D1E4D0D0
+ DFCCCBDECCCBE8D6D6E8D7D6E9D7D8EEDCDCF1E0DFF1DFDFF0DEDEF3E2E1F4E3
+ E2F0E0E0EADADAE6D6D6ECDDDDEADCDBEDDDDDF3E4E4F0E2E2FFF0EF79717000
+ 0000746C6BF4E1DFE8D6D5E2D0CEE8D5D4DDCBCADECFCEF2E0E0E3D3D2E0CFCE
+ EEDCDCEBD9D9E6D5D4EAD8D7EEDBDAF0DCDBE5CFCDEFD9D7EBD5D4E8D3D2D9C5
+ C4DCC7C6F2DCDCE9D4D3ECD6D5E8D2D1E6CFCEE9D4D2DCC7C6DEC8C7E6D0CFE7
+ D0D0E7D1CFE5CECDE6CFCEDBC4C3DFC8C7EFD7D6E5CBCAECD4D2ECD5D4E8D2D0
+ EBD3D2E9D0D0E7CECEE6CCCBEAD1D0DDC3C2E8CDCCE9CECDE6CACAE9CCCCE8CA
+ C9EACDCBD9BDBBE7CAC9E9C9C7E2C2C0EECDCBF1CFCEEBC8C6E5C2C0EFCAC8E7
+ C2C0E9C4C2E9C5C3E5C1BFE9C4C2EBC4C2DEB7B5E7C2C0ECC7C5E9C3C1EAC2C0
+ E6BFBDEDC5C3E9BFBCEDC2BFE9BCB9E9BDBAE9BEBBEEBEBBE8B9B6E5B6B3EDC1
+ BFF0C0BDEABBB8EBBDBAF0C2BFEAC2BFEAC0BDEBBFBDECBFBCE8BFBCEBC0BDEC
+ C1BEEEC3C1EBC0BDEABDBBEBC2C0EFC5C2EDC3C1E1B7B5E9C1BEE9C5C2E9C7C5
+ E8C2C0E6BFBDE6C0BFDBB8B6EAC6C4F4CECDF0CAC8F1CCCAE6C3C1F2D0CFEDCC
+ CAEACAC7EBCAC9DCBCBADDBEBDE8CAC9EBD0CFEFD4D3DCC0BFE4CACAEBD2D1E7
+ CECDE9D0CFEBD2D1E7CECDEDD4D3F1D8D6ECD2D1E6CBCAEDD4D2DFC5C5E2C9C8
+ D9C1C0DBC3C1EED6D5E7D0CFDDC5C4ECD5D4E7D1D0E3CFCDE5D2D1D5C2C1E2CE
+ CDE8D3D2E7D3D2E5D0D0E0CCCCE5D1D1E2CFCFD8C7C7DFCECEF0DFDFF2E1E0ED
+ DCDBE5D4D4E7D6D5F0DFDEEBDAD9E8D8D7EEDEDEECDBDBE2D3D2E4D4D4E2D3D3
+ EDDEDEE8D9D9ECDEDDF9EAEA736B6B000000746B6AE4D1CFE3D1D0D2C1C0E4D1
+ D1E0CECDDECFCEE2D2D1DECECDDBCACAE2D0D0DBC9C8DDCBCAD7C4C3E3CFCED8
+ C4C3E0CBCADDC9C8E9D5D4D9C5C4D5C1C0E4D0CEF3DEDCE5D0CFD6C0C0E4CECD
+ D9C3C2E0CAC9DFCAC9DDC7C6E2CCCBD7C0C0E2CCCBD8C1C1E2CCCBDCC6C4E3CC
+ CBEFD9D7D4BCBADFC7C6EDD6D5E7D0CFE1C8C8DCC4C3DFC6C6DDC5C4E7CFCEDD
+ C3C2E7CCCBE1C5C4E1C6C5E3C8C6DFC4C3EED3D2DCBFBEE9CAC8E4C4C2DABBB9
+ EACAC9F0CFCDEDCAC9DBB8B6ECC7C6E3BFBDE1BEBCE1BFBDE3C0BDE8C2C0EAC5
+ C3DFBAB8E7C3C1E2BEBCE2BBB9E1BAB8E1BBB8E9C0BEECC3C0EBC1BEE1B5B2E6
+ BDBAE3B7B5EABCB9E4B6B3E4B8B5E5BBB9E8B9B7E2B5B2E9BDBAEBBEBBE4BDBA
+ E6BCBAE9C0BDE6BAB7E5BCBAE5BBB8E4BAB7EBC1BFE3BAB7E4B7B5EAC2BFEDC5
+ C3EDC4C1E0B8B5E5BDBBE3BDBBE2C0BEE4C2BFDEB9B7ECC6C4DEBAB7EBC7C5F2
+ CFCDF0CCCAE2BDBCDBB7B5F0CECCE1C0BEE8CAC8E0C2C0E0C1C0E8C9C8EACBCA
+ E9CCCBEBCFCEDAC0BFE7CDCCE4CACADEC5C4E7CECEE9D1D0D9C1C0DFC6C6F1D9
+ D8E5CCCBD8BFBEEFD6D5DBC2C1E3CAC9E0C7C6E0C8C7EAD2D0DEC6C5DEC6C5E3
+ CBCAE5CDCCD8C1C0EAD5D5D9C5C4EAD6D5EDDAD9E3CFCFD6C3C1DECBCAE3D0CF
+ DECCCCDAC9C9E3D3D3EEDDDDE3D2D3DACAC9E3D2D2DAC9C9E2D2D1DCCCCBE1D1
+ D0DFCFCFE0D0D0DDCDCDDDCDCDD7C8C8EEDFDED8C9C9E8D9D9EADAD96E666500
+ 0000766D6CE6D2D1F5E3E1DCCBC9EBD8D7E4D2D1E1CFCEDFCECDEAD8D7E2D0D0
+ DDCCCADBC9C8EFDCDBD9C6C5E2CFCED5C1C1E9D5D4DECAC9D2BEBDE1CDCCECD9
+ D7E2CECDF0DBDAE4CECDD1BCBBE5CFCEDCC6C5DEC8C7DEC9C9DFCBCBE5D0CFD9
+ C3C3EBD6D5DDC7C6EBD5D4E0CAC9E3CECDE8D2D1D9C1C0DDC5C3ECD4D3EDD5D5
+ DFC8C7E2CBC9EBD3D2DEC5C4E8CFCEDDC3C2E6CBCAE0C6C5E3C8C7E7CDCBE1C8
+ C7EED2D1DEC0BFECCDCBE0C2C0DDBDBCE6C7C5EDCDCBEBC9C7E1BEBCE3C0BFE1
+ C0BEE8C6C4E2BFBEE6C3C1E8C4C2E2BEBCE5C1C0E4C2BFE2BDBBEAC3C1EBC5C2
+ E5BFBCE4BCBAEDC4C2EBC1BFE1B7B4ECC4C1E2B8B5E4B8B5E6BAB7E9BEBCE1B8
+ B5E4B7B4E3B7B4EBBFBDE8BDBAE2BCB9E6BDBAE7BEBCE2B6B4E9C1BEE6BDBBE8
+ C0BEEBC2BFE1BAB7E3B8B6E7BEBBF1CBC8F0C8C6DFB9B6ECC4C2E9C2C0E6C2C0
+ EAC8C7E1BDBCEBC6C3DCB7B5E8C5C3EFCDCBEECCCBDFBCBADFBCBAE5C4C3E1C1
+ C0DEC1C0E6C9C8EBCFCEE4C8C6E5C7C6E8CAC9DFC2C1E1C7C6DFC6C5E5CCCBE0
+ C7C6EED6D6E6CFCEE0C8C7E1C9C9ECD5D4E0C9C8DFC7C6E4CCCCDEC6C5E6CECC
+ E1C8C7E0C7C6E4CCCBE3CBC9EDD5D4DBC3C2EDD6D5DEC6C6EED8D6D8C4C2E7D3
+ D1EFDBDAECD9D8DBC8C6E8D5D5E0D0D0DACACAE7D6D6E8D8D8E9D8D8DCCCCCD7
+ C7C7ECDBDBDECECEDDCDCEE1D1D1E9DADAD9C9C9D8C8C8E3D4D3E0D1D1D7C8C8
+ E5D6D5D9CACAEEDFDFE8D8D7746C6B000000726969E3CFCEE7D4D3D6C4C3DECC
+ CBDBC9C8E1D0D0E0CFCEDAC9C8D6C4C4DACAC8DCCBCADECCCCDAC9C9E5D3D2D5
+ C1C0E7D4D3DBC7C6E9D4D4E8D4D3DEC9C9D6C1C0F0DBDAF0DADADBC6C5DFCACA
+ DBC7C6E2CDCDDCC8C8E2CECEE5D1D1D7C3C2E4D0D0D9C5C5E2CECCDAC6C6E4CF
+ CEDCC6C4E2CAC9DCC3C2E0C8C7EED7D6E5CFCEDEC6C5E2C9C9DFC6C5E7CECDDD
+ C3C3E6CDCCDEC5C4E2C9C8E4CBCADEC3C2E4C7C6E1C3C2E6C8C6DCBEBDE5C7C5
+ E2C3C1EDCCCBEAC8C6E5C4C3DDBBBAE4C3C2EBCAC7E0BDBBE0BDBBE2BEBCDFBB
+ BAEAC8C5E0BDBBE3BEBCE6C0BEEAC6C3E0BAB8E6BFBDECC4C1EAC1BFE2BAB8E6
+ C0BEE2B8B6E9BFBCE5BAB7E3BBB8E6BEBBE5B9B6E2B8B5EFC5C3EEC3C0E4BEBB
+ E2BBB9E3BCB9E3B9B6E3BBB9E1B9B8E6BFBCE4BCBAE5BEBCE5BDBBE2B8B6ECC7
+ C4E8C2C0DDB7B5E7C0BEE4BDBBE3BFBCE4C2C1DCBBB9E1BEBCDDBAB8ECC9C7EB
+ CAC8ECCBC9DEBEBBDDBCBBE1C0BFE0C0BFE5C7C6E3C7C6E0C4C4E1C6C4EBCFCE
+ E7CAC9DBBFBDE9CCCBDDC3C2DDC3C2DEC5C4E0C8C8DCC5C4E5CDCCE4CDCCDEC7
+ C6DEC7C6E5CDCDDEC7C6DDC6C5E2CAC9DCC5C3E7CECDE5CDCCDFC7C6E5CECCD8
+ C1C0E7D0CFDAC3C2E0CAC9D7C1C0EBD5D4EBD6D6E5D1D1D9C6C6DDCCCBE3D3D3
+ E1D2D1E2D3D3E9DADAF0E0E0DECFCEDAC9CAE6D5D5D9CAC9E7D6D6DECFCEE0D1
+ D2E1D3D2DFD0D0DCCDCCDBCCCCDFD0D0E3D4D4D4C5C6E6D7D7EBDADA69616100
+ 00007B7272F9E6E5EFDEDDECDBDAE9D9D8EDDDDDECDCDBECDBDBE6D5D5DFCFCE
+ E8D7D6EDDCDBE5D3D3E7D6D5EDDADAEAD6D5ECD8D7E5D1D0EAD6D5E7D3D2E6D1
+ D1EBD6D6EEDAD9EAD6D5E7D3D2E7D2D1E7D3D2EBD6D6E1CDCCE3CFCEE6D3D3E5
+ D1D1E9D4D4E4D1D0EBD7D6E5D1D0E9D4D3E8D1D1F1DAD8F2DAD9EDD6D5F1DBD9
+ F0DAD9E9D2D1E6CECDEBD2D1EBD1D1EAD1D0E8CFCDE8CFCEE8CFCEEAD0CEE7CC
+ CAE7CAC9EACDCBEBCDCCE4C6C4E7C8C7EDCECBEDCDCBEAC9C8EACAC9DFBFBDE6
+ C7C5EACAC7E8C5C3E8C5C3E7C4C3E8C6C4ECCBC8ECC9C7ECC7C5EBC7C5ECC8C6
+ EBC6C4ECC6C3EBC4C2EAC2C0EAC3C1E8C2BFEBC2BFECC3C1EAC0BEEAC3C1EBC4
+ C1EFC3C2EBC2C0EBC2BFECC2C0EBC6C4EAC3C1ECC6C3EDC4C2EAC2C0EBC5C2EF
+ C9C6EAC4C1EFC8C6EFCAC7ECC4C2EEC7C5F1CCCAEBC5C4EBC5C3EBC5C3EFCBC9
+ F0CCCBEDCDCCE7C7C5E6C5C3ECCBC9E7C6C5ECCDCBEACCCAEACBCAEACAC9ECCD
+ CCEFD0CFEDCFCEE7CCCBEED3D2EFD4D3EACFCFE9CECEECD0CFEFD3D3ECD3D2EA
+ D2D1EFD7D6E9D2D1ECD4D4EFD8D6EED7D6EED6D6EED7D6ECD5D4EFD8D7EFD8D8
+ EAD3D3F1D9D8E4CDCCE1CAC9F1DAD9DBC4C3F3DCDBEFD9D7E8D2D1EAD5D4EDD8
+ D7ECD7D6EEDADAEBD7D6E5D4D3ECDCDCDED0D0DFD1D1E5D7D7EDDEDEE3D4D4EB
+ DBDBE9D9DAE9D8D8EEDDDDE6D6D6EDDFDFEADCDBEADCDCEADCDBECDDDDECDDDC
+ F0E1E1E6D9D8EBDDDCFBEDEC746C6C0000007A7271F5E4E3EAD9D8E8D8D7E7D8
+ D7EFDFDFF0E0E0EEDEDDEFDFDFE1D0CFE7D6D5EADBD9F0DFDEEBDAD9EDDBDAED
+ D9D8E7D4D3E8D4D3E2CECDE8D4D3EFDAD9ECD6D5E9D5D5E9D6D5E7D3D3E7D3D2
+ EAD6D5ECD8D7ECD8D7EBD7D6EDDAD9EBD9D8EDDADAE8D5D5E9D5D5E9D4D3EDD8
+ D7EBD5D4EED9D7F1DBDAEDD6D6E8D2D0EFD8D7EFD7D6EBD4D3EED6D5EBD1D0EE
+ D5D5E8D0CEEBD2D1EED4D3EBD0D0E7CBCAE7CCCAEACECDF2D4D3F0D2D0ECCDCB
+ F0D0CEF0D0CEEBCBC9E1C1C0E1C2C0EBCBC9ECCAC8EBC9C8F1CFCDEBC9C8EBCB
+ C9ECCBC9EBC8C6EAC7C5ECCAC7EDC9C7ECC8C6EDC7C5EFC9C8EDC5C4EDC9C7EF
+ C8C6EEC6C4EDC4C2EAC2C0EBC5C3E6C1BEECC3C1E9C2C0EBC3C1ECC4C2E9C6C3
+ EBC6C4EEC8C5ECC5C4EAC3C1E9C5C2EEC8C5E9C4C2EDC7C5EDC8C5ECC5C3E8C1
+ BFE9C5C3E9C5C2E6C1BFE9C4C2EECAC8EECBC9EECFCDEBCDCBE9C9C8EBCBCAE5
+ C5C4E9CAC9E3C5C4EACCCBEBCDCCECCECCEBCDCBECCECDE8CCCBEAD0CFEED4D3
+ ECD1D1EED3D3EFD4D4F0D5D4EED3D3EDD4D4ECD5D4EED7D6E7CFCEE9D2D1F1DA
+ D9ECD5D4EBD3D3E7D0CFE9D3D2EED9D9EAD6D5EBD5D5EBD6D5DAC5C4DBC6C5E0
+ CACAF1DCDBF0DBDCEBD7D7EDDADAF1DDDCEDD9D8F0DCDBF2DEDDE7D5D5E8D7D7
+ DACBCCE0D1D0E3D4D4EDE0E0E8D9DAEBDDDDE9DADAEBDBDBE5D5D5DFD0D0DED0
+ CFE0D1D1E5D5D5E3D4D4ECDEDDEADBDBECDEDDF2E3E3F2E4E4FFF5F47A727200
+ 000078706FF7E6E5EBDADAEBDBDBEBDCDCE9DADAEDDDDDEEDFDEEDDDDDE0CFCF
+ E1D1D0E8D7D6E8D7D6E9D7D7EDDAD9F0DDDCEEDBD9F1DEDDEFDBDAE9D5D4E8D3
+ D3E9D5D4EFDBDAEDDAD9EAD7D6E6D3D3ECD9D8ECD8D8EFDCDBECD8D8EBD9D7EA
+ D7D6EEDADAECD8D8EBD6D6E9D4D4ECD7D6E8D2D2EDD8D7EBD5D5ECD4D5E7D0CF
+ EED6D5F0D9D7ECD4D4EBD3D2E7CFCEEBD4D2E6CDCCE7CDCCEED3D2EDD1D0EACF
+ CEEBD0CFECD0CFEACDCBECCDCCEECFCDEDCFCDECCDCCEECFCDECCDCBECCDCCEC
+ CDCCECCBC9EBCBC9F0CFCDE7C7C5E9C8C6ECCBC9E8C5C4E8C6C4EDCAC8EDCAC8
+ EBC7C4E6C1BFEEC8C7ECC6C5EBC8C6E8C1BFEAC2C1EFC7C6EEC7C4EFCBC9EDC8
+ C6F0C8C6ECC6C3ECC6C3EBC4C1EBC8C5EAC6C3EEC8C7EDC7C5EDC5C3EECAC8EE
+ C9C7EAC6C3EEC9C7F0CBCAF2CDCBF2CCCAEAC6C5EBC9C7EBC8C7EAC6C5EAC8C6
+ EBCAC9ECCCCAECCFCDECCECDEDCDCDEACBC9ECCDCBE7C9C7E6C9C8E4C8C6E5C8
+ C7EBCDCCF0D2D1E8CCCAE5CAC9EBD0D0E9D0CFECD3D2EDD4D3EAD0D0EBD1D1ED
+ D4D4E9D1D1EBD4D3E5CFCEE9D2D2F0D9D8F0DAD9F1DBDBEBD6D5E8D4D3E9D5D5
+ E7D3D3E6D2D1F0DCDBE9D4D3E5D2D1E6D3D2ECD9D8ECD9D8E5D1D1E3CFCFE9D5
+ D4EAD6D6EEDBDBF3E0DFEDDADAEBDAD9E9D9D9E4D4D4E6D7D7EADCDDE8D9DAEA
+ DCDCE5D7D7EBDCDBECDCDCE9DBDBE7D9D8ECDDDDEEDDDDEDDDDDEAD9D9E1D1D1
+ E3D4D4E9D9D8E9DAD9FFF4F37B7272000000787070E8D7D7E5D3D4E9DAD9EDDF
+ DEEDDEDEEFE0DFF0E0DFDBCBCADECECEECDBDBF3E3E2DFCECDDFCCCBEFDBDAF1
+ DEDDF7E3E2F6E2E1F2DEDDF2DEDCDECAC9DBC7C6E0CDCCEFDCDCF0DDDCEAD7D6
+ F1DEDEEEDBDAEEDCDBECD9D9EFDBDAEEDAD9F0DBDAF1DBDBEFD9D9EEDAD9F1DC
+ DBEBD6D5EFD8D8EDD6D6EDD6D5E8D0D0EED7D6EFD7D6F1D9D8EFD9D7EED7D6F1
+ D9D7EFD5D4EDD3D1F3D8D7EFD4D3E9CFCDECD1CFF1D5D3F0D3D1EED0CFEED0CE
+ F1D3D1ECCFCDEDD0CEF0D2D0F0D2D0EFD0CEE3C3C1E8C9C6F5D5D3EACBC9EBCB
+ C9F4D3D0EECCCAE9C7C5EDCBC9EFCCCAF0CCCAE8C4C2ECC7C5ECC8C6EDCBC9E9
+ C3C1E8C3C1EEC8C6EBC6C3EECAC9EBC7C5F0C8C6EDC7C5EEC9C7ECC5C3EBC8C7
+ E9C5C3EDC8C6F0CCCAEFC9C7EFCCCAF2CECCEDC9C7F0CCCAF3D0CDF4D1CFF5D1
+ CFF4D0CEEDCBCAEFCECCEDCCCBE6C5C4EBCAC8ECCBCAEBCDCCEDD1D0ECCFCDEA
+ CCCAECCDCCEED0CFEED1D0EED3D1E9CDCCE7CAC9ECCECDEACDCCDFC3C2E4CAC9
+ EDD4D3EFD7D6F1DAD8EAD1D0ECD2D2EED5D4EBD2D1F0D7D7E9D1D0EAD3D2EED8
+ D8E8D2D1ECD6D6DFCAC9EAD6D6EDD9D9EEDADAE9D5D5EFDBDAF0DCDBF0DCDCDF
+ CACAE3CFCFF2DFDEECD8D8EAD7D6EFDCDBEBD7D7EEDADAF0DDDCF3DFDFEEDCDC
+ F0DEDEEBDADAE9D9D9EADBDBE8D8D8F0DFDFE8D8D8EADADAEADCDCEEE0DFE9DA
+ DAEADADAE9D8D7ECDBDAF4E4E3EDDDDCEDDDDDF0E0E0E7D8D6FFF6F4736A6A00
+ 0000797071E8D6D6E1D0D0E5D6D5DDCFCEDDCFCFE0D1D1EADAD9D8C7C7DACACA
+ E1D1CFE6D5D5DECDCDD8C6C5DBC8C7DBC7C6E5D2D1DFCBCADAC7C6ECD9D8EDD9
+ D8E2CECED3C0C0E7D5D4F0DDDDEBD8D7DFCCCBE0CDCCDDCAC9E1CDCDDECAC9DB
+ C7C6E5D0D0F1DCDCE0CCCBE3CECDEBD6D5E0CBCAE3CDCDEFD8D7E7D0CFDBC4C3
+ DFC8C7E9D3D1EFD9D8E9D3D2EAD3D2EFD5D4E8CECCE3C8C7EACFCEF1D7D6E2C7
+ C6E5C9C7F1D4D2E8CAC9E0C3C1E4C7C5EDD1CFE8CCCAE3C6C4E9CBC9E4C6C4EC
+ CDCBE4C4C2E2C2C1EACBC9EECFCDE8C8C6E5C4C2E5C4C2EDCDCBEDCCCAE1BEBC
+ F2CECCF0CCCAF0CCCAE7C6C4E5C3C1E6C1BFE6C1BFE4BFBDE7C3C1E1BEBDE3BE
+ BCF0C9C7E6C1BFE5C1BFE7C2C0E5C3C0EFCDCAE2BEBBECC9C7EEC9C8E0BDBCEA
+ C7C5EDCAC8E5C2C0E8C5C3F2D0CEE8C4C3EDC9C7EECECDE4C3C2F1D0CFEDCDCC
+ E9C9C7E0C0BEE2C2C1E7CAC9E2C7C5E7CAC9E1C3C2E3C6C5E3C6C6EACFCEE0C5
+ C4EDD1D0EFD3D1EFD3D2DFC3C2E3C8C7E7CCCCE1C8C7E5CDCCEDD5D3E9CFCEE1
+ C8C7E7CFCDF1D8D7E0C8C8E9D2D1E7D0CFDFC9C8E9D4D3DAC6C7E8D4D4E5D1D2
+ DECBCAE3CFCFE9D4D4DCC8C7E6D1D1DCC9C8E1CECCF2DEDDE1CCCCEAD5D4F0DB
+ DBDECAC9DECAC9DCCAC8E5D1D1DECBCAE9D6D5F1DFDFEFDEDEEFDDDDEDDDDDE8
+ D7D7E4D2D2E4D4D4E1D2D2DFD0CFE1D2D1EADBDAE1D2D1E5D5D4E1D1D1E7D8D7
+ E0CFCFE4D4D4E7D7D7F5E8E7746B6B0000007E7575F7E5E3F8E7E6F3E2E2E6D6
+ D5F8E7E8E6D5D5FEEDEDEAD9D8F5E3E2ECDAD8EFDDDDF2DFDFEEDAD9F9E4E3E8
+ D3D2EAD5D4F1DCDBEDD8D7E8D4D2E7D2D1EED8D7FAE6E5FBE7E7F8E4E4E9D6D5
+ ECD7D7F3DFDEEDD9D8F7E2E2E9D3D3F2DDDBE9D3D3FDE9E7E8D3D2F5DFDEEDD6
+ D5F7E0DFEFD7D6F5DDDCEFD6D6F5DDDDEDD5D5F2DBD9FFEDEBFFEAE9FFE6E4FC
+ DFDEE7CBCAFADFDDEDD1CFF2D4D3ECCFCDF9DAD9FFE0DEECCDCCF6D8D6EED0CE
+ FBDEDCF4D6D5F1D2D1F2D1D0F1D0CEFFDEDCF2D1CFF2D2D0EFCFCCEFCECCEBCA
+ C7FAD7D5EFCBCAF6D2D1F9D5D3E6C1BFFCD7D5FFDCDAFBD5D3F0CDCBF5CFCDFA
+ D3D2F1CAC8F3CBC9F5CECDF4D0CEF2CCCAF8CFCDF1CBC9FAD3D1F8D1CEF0CCCA
+ FDD9D8F1CBC9FAD6D3F3CCCAFBD7D5F3CFCEFDD8D6EFCBCAF7D2D1FFDDDAEECA
+ C7FCD7D5F8D4D3E9C7C5FDDAD9FFDDDCFEDDDBF1CFCDF3D2D1F4D5D4F9DBDAF1
+ D4D3F6D7D7F0D1CFF5D6D5F6D7D6F1D3D2FFE5E4FEE2E1FDE0DFEBCDCCF1D4D4
+ F4D8D7F1D5D4FEE2E1FADFDEEED3D1E6CCCBF6DCDBF4DAD9E6CCCBF1D8D7F3DA
+ D9ECD4D3FDE6E6ECD6D7F8E4E3ECD8D7F0DBDAEDD8D7FBE6E6E8D2D2FAE5E4F0
+ DBD9F5DFDFFCE6E5E2CDCCF6E0DFF4DEDDEDD8D7F2DDDCE8D3D2F5E2E1E4CFCE
+ F7E2E2FBE7E7FEEAE9FFECEBF5E1E0E3CFCEFAE5E5E7D5D4F9E7E6ECDADAF8E7
+ E6F0E0DFEBDBDAEFDEDDEEDEDEFEEDECEEDEDDEBDADAEBD9D8FFF5F5837A7A00
+ 00003B3737756D6C787070776F6E6D6565756E6D6D65657870706F6666746B6B
+ 7168687169697168686E65647268686B61616A6160766C6B736969685E5D6F65
+ 657C72717D73737B72727970706D6564716867736969716767756B6A6E646472
+ 69686C6262766C6C6D6363756B6B6E6363786E6D7267677065656E6463726767
+ 6F65656E6463766A6A786C6C776A697669686C5F5E766A697163637467667162
+ 627667677A6B6A6E605F7869697062617467667365647365647466656E5F5E79
+ 69687363637667667566656E5F5E6F5F5E7B6C6A74636372616171605F6C5B5A
+ 715F5E78666575646374636272615F7A68677362607462617361617867667462
+ 627462617463617564627A686774636273636274626175656372615F7A696874
+ 64637867667262617665647A696870605F76656470605F6E5F5E736463796968
+ 7767677363626E5F5E7364637668676F61617769687263637466657365647264
+ 647A6C6C776B6A7366666D605F6E6160746665716363786B6A776B6A6E62616E
+ 6262766A697064646D61606E61607165657065647469686E64647369696E6464
+ 736969706666746A6A6F6565776D6D706666736968746A6A6F6565756B6A7168
+ 67736969766C6C6F6565736A696B6261776D6D776E6D746B6A766D6C72696869
+ 5F5E7065656B6160746B6B6D6565776E6E6F6867726A6A746C6C6D65657A7272
+ 736B6B6961616C6464817B7B3D3939000000}
+ ShowHint = True
+ Transparent = True
+ OnClick = Image1Click
+ end
+ object MediaPlayer1: TMediaPlayer
+ Left = 88
+ Top = 1
+ Width = 253
+ Height = 30
+ Display = Panel1
+ FileName = 'C:\WINNT\winnt256.bmp'
+ Visible = False
+ TabOrder = 0
+ end
+ end
+ object pnlAvailable: TPanel
+ Left = 0
+ Top = 81
+ Width = 281
+ Height = 326
+ Align = alLeft
+ BevelOuter = bvNone
+ TabOrder = 1
+ object Panel2: TPanel
+ Left = 0
+ Top = 296
+ Width = 281
+ Height = 30
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton4: TSpeedButton
+ Left = 200
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = 'I&nstall'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 33333333FF33333333FF333993333333300033377F3333333777333993333333
+ 300033F77FFF3333377739999993333333333777777F3333333F399999933333
+ 33003777777333333377333993333333330033377F3333333377333993333333
+ 3333333773333333333F333333333333330033333333F33333773333333C3333
+ 330033333337FF3333773333333CC333333333FFFFF77FFF3FF33CCCCCCCCCC3
+ 993337777777777F77F33CCCCCCCCCC3993337777777777377333333333CC333
+ 333333333337733333FF3333333C333330003333333733333777333333333333
+ 3000333333333333377733333333333333333333333333333333}
+ NumGlyphs = 2
+ OnClick = Button2Click
+ end
+ object SpeedButton5: TSpeedButton
+ Left = 4
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = '&Info'
+ Flat = True
+ OnClick = SpeedButton5Click
+ end
+ object SpeedButton6: TSpeedButton
+ Left = 69
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = '&Select'
+ Flat = True
+ OnClick = Button5Click
+ end
+ object SpeedButton7: TSpeedButton
+ Left = 135
+ Top = 3
+ Width = 65
+ Height = 25
+ Caption = 'Select &All'
+ Flat = True
+ OnClick = Button6Click
+ end
+ end
+ object PageControl1: TPageControl
+ Left = 0
+ Top = 24
+ Width = 281
+ Height = 272
+ ActivePage = TabSheet1
+ Align = alClient
+ MultiLine = True
+ TabOrder = 1
+ object TabSheet1: TTabSheet
+ Caption = 'Local'
+ object localTree: TTreeView
+ Left = 0
+ Top = 0
+ Width = 273
+ Height = 244
+ Align = alClient
+ Images = ImageList1
+ Indent = 19
+ ReadOnly = True
+ StateImages = ImageList2
+ TabOrder = 0
+ OnDblClick = localTreeDblClick
+ end
+ end
+ end
+ object Panel8: TPanel
+ Left = 0
+ Top = 0
+ Width = 281
+ Height = 24
+ Align = alTop
+ Alignment = taLeftJustify
+ BevelOuter = bvNone
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentFont = False
+ TabOrder = 2
+ object Label1: TLabel
+ Left = 0
+ Top = 0
+ Width = 53
+ Height = 24
+ Align = alLeft
+ BiDiMode = bdLeftToRight
+ Caption = 'Available'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentBiDiMode = False
+ ParentFont = False
+ Layout = tlCenter
+ end
+ object Panel3: TPanel
+ Left = 53
+ Top = 0
+ Width = 228
+ Height = 24
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton2: TSpeedButton
+ Left = 180
+ Top = 0
+ Width = 23
+ Height = 22
+ Enabled = False
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 333333333333333FF3FF3333333333CC30003333333333773777333333333C33
+ 3000333FF33337F33777339933333C3333333377F33337F3333F339933333C33
+ 33003377333337F33377333333333C333300333F333337F33377339333333C33
+ 3333337FF3333733333F33993333C33333003377FF33733333773339933C3333
+ 330033377FF73F33337733339933C33333333FF377F373F3333F993399333C33
+ 330077F377F337F33377993399333C33330077FF773337F33377399993333C33
+ 33333777733337F333FF333333333C33300033333333373FF7773333333333CC
+ 3000333333333377377733333333333333333333333333333333}
+ NumGlyphs = 2
+ Visible = False
+ end
+ object Image2: TImage
+ Left = 72
+ Top = 8
+ Width = 14
+ Height = 16
+ Picture.Data = {
+ 07544269746D617076010000424D760100000000000076000000280000002000
+ 0000100000000100040000000000000100000000000000000000100000001000
+ 0000000000000000800000800000008080008000000080008000808000007F7F
+ 7F00BFBFBF000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
+ FF0033333333333333333FF3333333333333447333333333333377FFF3333333
+ 3333744473333333333337773FF3333333333444447333333333373F773FF333
+ 333333444444733333333373F3773FF3333333744444447333333337F333773F
+ F333333444444444733333373F3333773FF333334444444444733FFF7FFFFFFF
+ 77FF999999999999999977777777777733773333CCCCCCCCCC3333337333333F
+ 7733333CCCCCCCCC33333337F3333F773333333CCCCCCC3333333337333F7733
+ 333333CCCCCC3333333333733F77333333333CCCCC333333333337FF77333333
+ 33333CCC3333333333333777333333333333CC33333333333333773333333333
+ 3333}
+ Transparent = True
+ end
+ object Label2: TLabel
+ Left = 92
+ Top = 8
+ Width = 87
+ Height = 13
+ Caption = 'Selected for Install'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ end
+ object SpeedButton1: TSpeedButton
+ Left = 8
+ Top = 0
+ Width = 23
+ Height = 22
+ Hint = 'Manage Remote Sources'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00555555555555
+ 5555555555FFFFF555555555544C4C5555555555F777775FF5555554C444C444
+ 5555555775FF55775F55554C4334444445555575577F55557FF554C4C334C4C4
+ 335557F5577FF55577F554CCC3334444335557555777F555775FCCCCC333CCC4
+ C4457F55F777F555557F4CC33333CCC444C57F577777F5F5557FC4333333C3C4
+ CCC57F777777F7FF557F4CC33333333C4C457F577777777F557FCCC33CC4333C
+ C4C575F7755F777FF5755CCCCC3333334C5557F5FF777777F7F554C333333333
+ CC55575777777777F755553333CC3C33C555557777557577755555533CC4C4CC
+ 5555555775FFFF77555555555C4CCC5555555555577777555555}
+ NumGlyphs = 2
+ ParentShowHint = False
+ ShowHint = True
+ OnClick = SpeedButton1Click
+ end
+ end
+ end
+ end
+ object pnlInstalled: TPanel
+ Left = 284
+ Top = 81
+ Width = 305
+ Height = 326
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 2
+ object Panel5: TPanel
+ Left = 0
+ Top = 296
+ Width = 305
+ Height = 30
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ object SpeedButton3: TSpeedButton
+ Left = 8
+ Top = 3
+ Width = 77
+ Height = 25
+ Caption = '&Remove'
+ Flat = True
+ Glyph.Data = {
+ 76010000424D7601000000000000760000002800000020000000100000000100
+ 0400000000000001000000000000000000001000000010000000000000000000
+ 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
+ FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333
+ 333333333333333333FF33333333333330003333333333333777333333333333
+ 300033FFFFFF3333377739999993333333333777777F3333333F399999933333
+ 3300377777733333337733333333333333003333333333333377333333333333
+ 3333333333333333333F333333333333330033333F33333333773333C3333333
+ 330033337F3333333377333CC3333333333333F77FFFFFFF3FF33CCCCCCCCCC3
+ 993337777777777F77F33CCCCCCCCCC399333777777777737733333CC3333333
+ 333333377F33333333FF3333C333333330003333733333333777333333333333
+ 3000333333333333377733333333333333333333333333333333}
+ NumGlyphs = 2
+ OnClick = Button4Click
+ end
+ end
+ object Panel7: TPanel
+ Left = 0
+ Top = 0
+ Width = 305
+ Height = 24
+ Align = alTop
+ Alignment = taLeftJustify
+ BevelOuter = bvNone
+ Caption = 'Installed'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -12
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentFont = False
+ TabOrder = 1
+ end
+ object Panel6: TPanel
+ Left = 0
+ Top = 24
+ Width = 305
+ Height = 272
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 2
+ object installTree: TTreeView
+ Left = 0
+ Top = 0
+ Width = 305
+ Height = 272
+ Align = alClient
+ Indent = 19
+ ParentShowHint = False
+ ReadOnly = True
+ ShowHint = False
+ TabOrder = 0
+ end
+ end
+ end
+ object statusBar: TPanel
+ Left = 0
+ Top = 407
+ Width = 589
+ Height = 22
+ Align = alBottom
+ Alignment = taLeftJustify
+ BevelOuter = bvLowered
+ TabOrder = 3
+ object Panel4: TPanel
+ Left = 436
+ Top = 1
+ Width = 152
+ Height = 20
+ Align = alRight
+ Caption = 'Panel4'
+ TabOrder = 0
+ object progressBar: TProgressBar
+ Left = 1
+ Top = 1
+ Width = 150
+ Height = 18
+ Align = alRight
+ BorderWidth = 2
+ Min = 0
+ Max = 100
+ TabOrder = 0
+ end
+ end
+ end
+ object MainMenu1: TMainMenu
+ Left = 748
+ Top = 4
+ object File1: TMenuItem
+ Caption = '&File'
+ object Exit1: TMenuItem
+ Caption = 'E&xit'
+ OnClick = Exit1Click
+ end
+ end
+ object Option1: TMenuItem
+ Caption = '&Options'
+ object LocalPath1: TMenuItem
+ Caption = '&Local Path...'
+ OnClick = LocalPath1Click
+ end
+ object ManageRemoteSources1: TMenuItem
+ Caption = '&Manage Remote Sources...'
+ OnClick = SpeedButton1Click
+ end
+ end
+ object View1: TMenuItem
+ Caption = '&View'
+ object LockedModules1: TMenuItem
+ Caption = '&Locked Modules'
+ OnClick = LockedModules1Click
+ end
+ end
+ object Help1: TMenuItem
+ Caption = '&Help'
+ object Contents1: TMenuItem
+ Caption = '&Contents'
+ OnClick = Contents1Click
+ end
+ end
+ end
+ object localPathDlg: TOpenDialog
+ Options = [ofNoChangeDir, ofEnableSizing]
+ Left = 716
+ Top = 4
+ end
+ object Timer1: TTimer
+ Left = 524
+ Top = 78
+ end
+ object ImageList1: TImageList
+ Left = 524
+ Top = 110
+ Bitmap = {
+ 494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000003000000001002000000000000030
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF0000FFFF00FFFFFF0000000000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF0000FFFF000000000000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000808080008080
+ 80008080800080808000808080000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 0000000000000000000080808000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF
+ 0000FFFF0000FFFF0000FFFF00000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF00000000
+ 00000000000080808000000000000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF0000FFFF
+ 0000FFFF0000FFFF000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000FF000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FF00000000000000FF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000BFBFBF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000C0C0C0000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000FF00000000000000FFFFFF0000000000FF00000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000000000000000000000000000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000000000000000000000000000FFFF00000000000000
+ 000000FFFF00000000000000000000000000000000000000000000000000FF00
+ 000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF000000000000FFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF000000000000FFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000FF000000FF00
+ 0000FF00000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF0000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000FFFFFF000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000FFFFFF000000000000FFFF0000FFFF0000FF
+ FF000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000FFFFFF00FFFFFF00FFFFFF0000000000FF00
+ 000000000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF007F7F7F00FFFFFF000000000000FFFF0000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF
+ FF0000000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF0080808000FFFFFF000000000000FFFF0000FF
+ FF0000FFFF0000000000000000000000000080000000FF000000FF000000FF00
+ 0000FF000000FF000000FF00000000000000FFFFFF00FFFFFF00FFFFFF000000
+ 0000FF000000000000000000000000000000000000000000000000FFFF0000FF
+ FF0000000000FFFFFF0000FFFF007F7F7F0000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000008080800000FFFF00FFFFFF000000000000FF
+ FF0000FFFF00000000000000000000000000FF00000080000000FF000000FF00
+ 0000FF000000FF000000FF000000FF00000000000000FFFFFF00FFFFFF00FFFF
+ FF0000000000FF000000000000000000000000FFFF0000FFFF0000FFFF0000FF
+ FF000000000000FFFF00FFFFFF007F7F7F00FFFFFF0000FFFF000000000000FF
+ FF0000FFFF0000FFFF0000FFFF00000000000000000000000000000000000000
+ 00000000000000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000FF
+ FF000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF0000FFFF000000000000FF
+ FF0000FFFF0000FFFF0000FFFF000000000000000000FF00000080000000FF00
+ 0000FF00000000000000FF000000FF000000FF00000000000000FFFFFF00FFFF
+ FF00FFFFFF0000000000FF00000000000000000000000000000000FFFF0000FF
+ FF0000000000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 000000000000FFFFFF0000000000FFFFFF0000000000FFFFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000808080008080
+ 80008080800080808000808080000000000000FFFF00FFFFFF000000000000FF
+ FF0000FFFF000000000000000000000000000000000000000000FF0000008000
+ 0000FF000000FF000000FF00000000000000FF000000FF00000000000000FFFF
+ FF0000000000FF0000000000000000000000000000000000000000FFFF0000FF
+ FF0000FFFF0000000000FFFFFF0000FFFF00FFFFFF000000000000FFFF0000FF
+ FF0000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000FFFF000000000000FFFF000000000000FFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000000000000000
+ 000000000000000000008080800000000000FFFFFF000000000000FFFF0000FF
+ FF0000FFFF00000000000000000000000000000000000000000000000000FF00
+ 000080000000FF0000000000000000000000FF000000FF000000FF0000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000000000000000000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF0000000000FFFFFF00000000000000
+ 00000000000000000000000000000000000000000000FFFF0000FFFF0000FFFF
+ 0000FFFF0000FFFF0000FFFF0000000000000000000000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000FF00000080000000FF000000FF000000FF000000FF000000FF000000FF00
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000FFFF0000FFFF0000FFFF0000FF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 000000000000FF00000080000000FF000000FF000000FF000000FF0000000000
+ 000000000000000000000000000000000000000000000000000000FFFF000000
+ 00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF00000000
+ 000000000000808080000000000000FFFF0000FFFF0000FFFF00000000000000
+ 000000FFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000FF00000080000000FF00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FFFF00000000000000
+ 0000000000000000000000000000000000000000000000000000FFFF0000FFFF
+ 0000FFFF0000FFFF00000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FFFF000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000300000000100010000000000800100000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000E00F000000000000E00F000000000000
+ E00F000000000000F00F000000000000F00F000000000000F80F000000000000
+ F00700000000000080070000000000000007000000000000000F000000000000
+ 001F000000000000001F000000000000001F000000000000811F000000000000
+ 811F000000000000C3BF000000000000FFFFFEFFE00FFEFFFDFFFC7FE00FFC7F
+ F8FFFC7FE00FFC7FF07FD837F00FD837E03FE00FF00FE00FC01FE00FF80FE00F
+ 800FC007F007C0070007C007F007800700030001F00700018001C007F00F0007
+ C003C007F01F0007E00FE00FF81F000FF00FE00FFE1F000FF81FD837FF1F8037
+ FC7FFEFFFF1F80FFFFFFFEFFFFBFC2FF00000000000000000000000000000000
+ 000000000000}
+ end
+ object ImageList2: TImageList
+ Left = 524
+ Top = 142
+ Bitmap = {
+ 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000001000000001002000000000000010
+ 00000000000000000000000000000000000000000000FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F00FFFFFF00FFFF
+ FF00FFFFFF000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000080000000800000007F7F7F000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F0000000000FFFFFF00FFFFFF00000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F0080000000800000008000
+ 00007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F0000000000FFFF
+ FF007F7F7F007F7F7F0000000000FFFFFF00FFFFFF0000000000000000000000
+ 0000000000000000000000000000000000000000000080000000800000008000
+ 000080000000800000007F7F7F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000007F7F7F000000
+ 0000FFFFFF00000000007F7F7F007F7F7F0000000000FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000800000008000
+ 0000800000008000000080000000800000007F7F7F0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00FFFFFF000000000000000000000000007F7F7F007F7F7F0000000000FFFF
+ FF00FFFFFF0000000000000000000000000000000000000000007F7F7F008000
+ 00008000000080000000800000008000000080000000800000007F7F7F000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F0000000000FFFFFF00000000000000000000000000000000007F7F7F007F7F
+ 7F0000000000FFFFFF00FFFFFF00000000000000000000000000000000008000
+ 0000800000008000000080000000800000008000000080000000800000008000
+ 00007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+ FF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF007F7F7F007F7F7F00FFFFFF00FFFFFF000000000000000000000000000000
+ 0000800000008000000080000000800000008000000080000000800000008000
+ 000080000000800000007F7F7F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F007F7F7F007F7F
+ 7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F7F007F7F
+ 7F0000000000000000007F7F7F007F7F7F000000FF000000FF000000FF000000
+ FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+ FF000000FF000000FF000000FF000000FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00007F7F7F00000000000000000000000000000000000000000000000000FFFF
+ FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00FFFFFF0000000000000000000000000000000000FFFFFF007F7F7F007F7F
+ 7F0000000000000000000000000000000000000000000000000000000000FF00
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F00000000000000000000000000FFFFFF007F7F7F007F7F7F00000000000000
+ 000000000000000000000000000000000000000000000000000000000000FF00
+ 0000FF000000FF000000FF000000FF000000FF000000FF000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000007F7F7F000000
+ 000000000000FFFFFF007F7F7F007F7F7F000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FF000000FF00
+ 0000FF000000FF000000FF000000FF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F00FFFFFF00FFFF
+ FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000FF000000FF00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F00000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000FF000000FF000000FF00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F007F7F7F00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF000000FF000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000100000000100010000000000800000000000000000000000
+ 000000000000000000000000FFFFFF009FFFFFFF0000000007FF1FFF00000000
+ 89FF07FF00000000A27F81FF00000000D49FC07F00000000E727C01F00000000
+ EBC9E007000000008000F00100000000000C000000000000F7E3F00300000000
+ E78FE00F00000000EE3FE03F00000000D8FFC0FF0000000083FF83FF00000000
+ 8FFF8FFF000000003FFF3FFF0000000000000000000000000000000000000000
+ 000000000000}
+ end
+end
diff --git a/apps/windoze/CBuilder5/InstallMgr/MainFrm.h b/apps/windoze/CBuilder5/InstallMgr/MainFrm.h
new file mode 100644
index 0000000..47fe65c
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/MainFrm.h
@@ -0,0 +1,146 @@
+//---------------------------------------------------------------------------
+#ifndef MainFrmH
+#define MainFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Dialogs.hpp>
+#include <Menus.hpp>
+#include <ExtCtrls.hpp>
+#include <MPlayer.hpp>
+#include <Graphics.hpp>
+#include <ComCtrls.hpp>
+#include <swmgr.h>
+#include <ImgList.hpp>
+#include <Buttons.hpp>
+#include <NMFtp.hpp>
+#include <NMHttp.hpp>
+#include <Psock.hpp>
+
+
+class VersionInfo {
+ public:
+ int major, minor, minor2, minor3;
+
+ VersionInfo(const char *version);
+ int compare(const VersionInfo &vi) const;
+ bool operator>(const VersionInfo &vi) const {return (compare(vi) > 0);}
+ bool operator<(const VersionInfo &vi) const {return (compare(vi) < 0);}
+ bool operator==(const VersionInfo &vi) const {return (compare(vi) == 0);}
+};
+
+
+class InstallSourceTab : public TControl {
+public:
+ __fastcall InstallSourceTab(TComponent *Owner, const char *confEnt, const char *type);
+ __fastcall ~InstallSourceTab();
+ string Type;
+ string Source;
+ string Directory;
+ string Caption;
+ TTreeView *tree;
+ SWMgr *mgr;
+};
+
+
+//---------------------------------------------------------------------------
+class TMainForm : public TForm
+{
+ class TWebThread;
+ friend class TWebThread;
+__published: // IDE-managed Components
+ TMainMenu *MainMenu1;
+ TMenuItem *File1;
+ TMenuItem *Exit1;
+ TMenuItem *Option1;
+ TMenuItem *LocalPath1;
+ TOpenDialog *localPathDlg;
+ TPanel *Panel1;
+ TMediaPlayer *MediaPlayer1;
+ TImage *Image1;
+ TPanel *pnlAvailable;
+ TPanel *pnlInstalled;
+ TSplitter *Splitter1;
+ TPanel *Panel2;
+ TPanel *Panel5;
+ TPageControl *PageControl1;
+ TTabSheet *TabSheet1;
+ TTreeView *localTree;
+ TPanel *Panel8;
+ TPanel *Panel7;
+ TPanel *Panel6;
+ TTreeView *installTree;
+ TTimer *Timer1;
+ TLabel *Label1;
+ TImageList *ImageList1;
+ TPanel *Panel3;
+ TImageList *ImageList2;
+ TPanel *statusBar;
+ TPanel *Panel4;
+ TProgressBar *progressBar;
+ TSpeedButton *SpeedButton2;
+ TImage *Image2;
+ TLabel *Label2;
+ TMenuItem *ManageRemoteSources1;
+ TSpeedButton *SpeedButton1;
+ TSpeedButton *SpeedButton3;
+ TSpeedButton *SpeedButton4;
+ TSpeedButton *SpeedButton5;
+ TSpeedButton *SpeedButton6;
+ TSpeedButton *SpeedButton7;
+ TMenuItem *View1;
+ TMenuItem *LockedModules1;
+ TMenuItem *Help1;
+ TMenuItem *Contents1;
+ void __fastcall LocalPath1Click(TObject *Sender);
+ void __fastcall FormCreate(TObject *Sender);
+ void __fastcall Button5Click(TObject *Sender);
+ void __fastcall localTreeDblClick(TObject *Sender);
+ void __fastcall Button6Click(TObject *Sender);
+ void __fastcall Image1Click(TObject *Sender);
+ void __fastcall Button4Click(TObject *Sender);
+ void __fastcall Button2Click(TObject *Sender);
+ void __fastcall SpeedButton1Click(TObject *Sender);
+ void __fastcall SpeedButton5Click(TObject *Sender);
+ void __fastcall Exit1Click(TObject *Sender);
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall LockedModules1Click(TObject *Sender);
+ void __fastcall Contents1Click(TObject *Sender);
+
+private: // User declarations
+
+ SWMgr *manager;
+ SWConfig *installConf;
+ const char *getLocalDir();
+ void setLocalDir(const char *idir);
+ void refreshPageControl();
+ void addSource(InstallSourceTab *ist);
+ void fillAllSourceTrees();
+ void deleteAllModules();
+
+public: // User declarations
+ __fastcall TMainForm(TComponent* Owner);
+ __fastcall ~TMainForm();
+ void __fastcall RefreshRemoteSource(TObject *Sender);
+ int selectAll(TTreeView *tree, bool sel);
+ int removeModule(const char *modName);
+ int installModule(const char *modName, InstallSourceTab *ist = 0);
+ static int createParent(const char *pName);
+ int createPathAndFile(const char *fName);
+ int copyFile(const char *sourceFile, const char *targetFile);
+ int copyFileToCWD(const char *sourceDir, const char *fName);
+ int FTPCopy(InstallSourceTab *ist, const char *src, const char *dest, bool dirTransfer = false, const char *suffix = "");
+ SWMgr *localMgr;
+ bool passive;
+
+protected:
+ virtual void fillInstallTree();
+ virtual void fillSourceTree(const char *sourceConf, TTreeView *tree);
+};
+
+//---------------------------------------------------------------------------
+extern PACKAGE TMainForm *MainForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp
new file mode 100644
index 0000000..148a7fd
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.cpp
@@ -0,0 +1,160 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "RemoteMntFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+TRemoteMntForm *RemoteMntForm;
+
+
+class TRemoteSource : public TObject {
+public:
+ string name;
+ string machine;
+ string dir;
+ TRemoteSource(const char *confEnt) {
+ char *buf = new char [ strlen(confEnt) + 1 ];
+
+ strcpy(buf, confEnt);
+
+ name = strtok(buf, "|");
+ machine = strtok(0, "|");
+ dir = strtok(0, "|");
+ delete [] buf;
+ }
+ string getConfEnt() {
+ return name +"|" + machine + "|" + dir;
+ }
+};
+
+
+//---------------------------------------------------------------------------
+__fastcall TRemoteMntForm::TRemoteMntForm(TComponent* Owner)
+ : TForm(Owner)
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TRemoteMntForm::FormShow(TObject *Sender)
+{
+ ConfigEntMap::iterator loop, end;
+ config = new SWConfig("./InstallMgr.conf");
+ ListBox1->Clear();
+ loop = config->Sections["Sources"].lower_bound("FTPSource");
+ end = config->Sections["Sources"].upper_bound("FTPSource");
+ while (loop != end) {
+ TRemoteSource *rs = new TRemoteSource(loop->second.c_str());
+ ListBox1->Items->AddObject(rs->name.c_str(), rs);
+ loop++;
+ }
+ ListBox1->ItemIndex = 0;
+ ListBox1Click(0);
+ CheckBox1->Checked = (!stricmp((*config)["General"]["PassiveFTP"].c_str(), "true"));
+ checkDisabled();
+}
+
+
+void TRemoteMntForm::checkDisabled() {
+ bool enabled = ListBox1->Items->Count;
+ NameEdit->Enabled = enabled;
+ MachineEdit->Enabled = enabled;
+ DirEdit->Enabled = enabled;
+}
+
+
+//---------------------------------------------------------------------------
+void __fastcall TRemoteMntForm::FormClose(TObject *Sender,
+ TCloseAction &Action)
+{
+ delete config;
+}
+
+
+void __fastcall TRemoteMntForm::SpeedButton4Click(TObject *Sender)
+{
+ ModalResult = mrCancel;
+}
+
+
+void __fastcall TRemoteMntForm::ListBox1Click(TObject *Sender)
+{
+ if (ListBox1->ItemIndex >= 0) {
+ TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex];
+
+ NameEdit->Text = rs->name.c_str();
+ MachineEdit->Text = rs->machine.c_str();
+ DirEdit->Text = rs->dir.c_str();
+ }
+ else {
+ NameEdit->Text = "";
+ MachineEdit->Text = "";
+ DirEdit->Text = "";
+ }
+}
+
+
+void __fastcall TRemoteMntForm::NameEditChange(TObject *Sender)
+{
+ if (ListBox1->ItemIndex < 0)
+ return;
+ TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex];
+ rs->name = NameEdit->Text.c_str();
+ ListBox1->Items->Strings[ListBox1->ItemIndex] = rs->name.c_str();
+}
+
+
+void __fastcall TRemoteMntForm::MachineEditChange(TObject *Sender)
+{
+ if (ListBox1->ItemIndex < 0)
+ return;
+ TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex];
+ rs->machine = MachineEdit->Text.c_str();
+}
+
+
+void __fastcall TRemoteMntForm::DirEditChange(TObject *Sender)
+{
+ if (ListBox1->ItemIndex < 0)
+ return;
+ TRemoteSource *rs = (TRemoteSource *)ListBox1->Items->Objects[ListBox1->ItemIndex];
+ rs->dir = DirEdit->Text.c_str();
+}
+
+void __fastcall TRemoteMntForm::SpeedButton2Click(TObject *Sender)
+{
+ if (ListBox1->ItemIndex < 0)
+ return;
+ int delItem = ListBox1->ItemIndex;
+ ListBox1->Items->Delete(delItem);
+ ListBox1->ItemIndex = (delItem < ListBox1->Items->Count) ? delItem : delItem - 1;
+ checkDisabled();
+ ListBox1Click(0);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TRemoteMntForm::SpeedButton1Click(TObject *Sender)
+{
+ TRemoteSource *rs = new TRemoteSource("[New Remote Site]|ftp.domain.org|/pub/sword/raw/");
+ ListBox1->ItemIndex = ListBox1->Items->AddObject(rs->name.c_str(), rs);
+
+ checkDisabled();
+ ListBox1Click(0);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TRemoteMntForm::SpeedButton3Click(TObject *Sender)
+{
+ TRemoteSource *rs;
+ config->Sections["Sources"].erase("FTPSource");
+ for (int i = 0; i < ListBox1->Items->Count; i++) {
+ rs = (TRemoteSource *)ListBox1->Items->Objects[i];
+ config->Sections["Sources"].insert(ConfigEntMap::value_type("FTPSource", rs->getConfEnt().c_str()));
+ }
+ (*config)["General"]["PassiveFTP"] = (CheckBox1->Checked) ? "true" : "false";
+ config->Save();
+ ModalResult = mrOk;
+}
+//---------------------------------------------------------------------------
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm
new file mode 100644
index 0000000..e2b7c64
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.dfm
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h
new file mode 100644
index 0000000..67c825d
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/RemoteMntFrm.h
@@ -0,0 +1,52 @@
+//---------------------------------------------------------------------------
+#ifndef RemoteMntFrmH
+#define RemoteMntFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Buttons.hpp>
+#include <ExtCtrls.hpp>
+#include <swconfig.h>
+//---------------------------------------------------------------------------
+class TRemoteMntForm : public TForm
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TPanel *Panel2;
+ TPanel *Panel3;
+ TListBox *ListBox1;
+ TSpeedButton *SpeedButton1;
+ TSpeedButton *SpeedButton2;
+ TEdit *NameEdit;
+ TEdit *MachineEdit;
+ TEdit *DirEdit;
+ TPanel *Panel4;
+ TSpeedButton *SpeedButton3;
+ TSpeedButton *SpeedButton4;
+ TLabel *Label1;
+ TLabel *Label2;
+ TLabel *Label3;
+ TCheckBox *CheckBox1;
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+ void __fastcall NameEditChange(TObject *Sender);
+ void __fastcall SpeedButton4Click(TObject *Sender);
+ void __fastcall ListBox1Click(TObject *Sender);
+ void __fastcall MachineEditChange(TObject *Sender);
+ void __fastcall DirEditChange(TObject *Sender);
+ void __fastcall SpeedButton2Click(TObject *Sender);
+ void __fastcall SpeedButton1Click(TObject *Sender);
+ void __fastcall SpeedButton3Click(TObject *Sender);
+private: // User declarations
+ SWConfig *config;
+ void checkDisabled();
+
+public: // User declarations
+ __fastcall TRemoteMntForm(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TRemoteMntForm *RemoteMntForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp
new file mode 100644
index 0000000..0abc9da
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.cpp
@@ -0,0 +1,273 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "StatusFrm.h"
+#include "MainFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+//#pragma link "IdBaseComponent"
+//#pragma link "IdComponent"
+//#pragma link "IdFTP"
+//#pragma link "IdTCPClient"
+//#pragma link "IdTCPConnection"
+#pragma resource "*.dfm"
+TStatusForm *StatusForm;
+
+
+
+
+struct FtpFile {
+ char *filename;
+ FILE *stream;
+};
+
+int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
+{
+ struct FtpFile *out=(struct FtpFile *)stream;
+ if(out && !out->stream) {
+ /* open file for writing */
+ out->stream=fopen(out->filename, "wb");
+ if(!out->stream)
+ return -1; /* failure, can't open file to write */
+ }
+ return fwrite(buffer, size, nmemb, out->stream);
+}
+
+
+
+
+
+//---------------------------------------------------------------------------
+__fastcall TStatusForm::TStatusForm(TComponent* Owner)
+ : TForm(Owner) {
+ suffix = "";
+ passive = false;
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+}
+
+
+__fastcall TStatusForm::~TStatusForm() {
+ curl_global_cleanup();
+}
+
+
+//---------------------------------------------------------------------------
+void __fastcall TStatusForm::FormShow(TObject *Sender)
+{
+ abort = false;
+ ftpThread = new TFTPThread(ist, src.c_str(), dest.c_str(), dirTransfer, passive, true, suffix.c_str());
+ ftpThread->OnTerminate = Cleanup;
+ ftpThread->Resume();
+}
+//---------------------------------------------------------------------------
+__fastcall TStatusForm::TFTPThread::TFTPThread(InstallSourceTab *iist, const char *isrc, const char *idest, bool idirTransfer, bool CreateSuspended, bool ipassive, const char *isuffix)
+ : TThread(CreateSuspended)
+{
+ ist = iist;
+ src = isrc;
+ dest = idest;
+ suffix = isuffix;
+ dirTransfer = idirTransfer;
+ Priority = tpNormal;
+ passive = ipassive;
+ FreeOnTerminate = true;
+ Synchronize((TThreadMethod)&CreateFTPObject);
+}
+
+__fastcall TStatusForm::TFTPThread::~TFTPThread()
+{
+}
+
+
+void __fastcall TStatusForm::TFTPThread::Execute()
+{
+ CURL *curl;
+ CURLcode res;
+ struct FtpFile ftpfile={
+ "curl.tar.gz", /* name to store the file as if succesful */
+ NULL
+ };
+
+ Synchronize((TThreadMethod)&PreConnect);
+ StatusForm->ftpCon->Host = ist->Source.c_str();
+ StatusForm->ftpCon->Username = "ftp";
+ StatusForm->ftpCon->Password = "installmgr@user.com";
+ StatusForm->ftpCon->Passive = passive;
+
+
+ curl = curl_easy_init();
+
+ if (curl) {
+ /* Get curl 7.9.2 from sunet.se's FTP site: */
+ curl_easy_setopt(curl, CURLOPT_URL,
+ "ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz");
+ /* Define our callback to get called when there's data to be written */
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
+ /* Set a pointer to our struct to pass to the callback */
+ curl_easy_setopt(curl, CURLOPT_FILE, &ftpfile);
+
+ /* Switch on full protocol/debug output */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);
+
+ res = curl_easy_perform(curl);
+
+ /* always cleanup */
+ curl_easy_cleanup(curl);
+
+ if(CURLE_OK != res) {
+ /* we failed */
+ fprintf(stderr, "curl told us %d\n", res);
+ }
+ }
+
+ if(ftpfile.stream)
+ fclose(ftpfile.stream); /* close the local file */
+
+/*
+ try {
+ StatusForm->ftpCon->Connect(true, -1);
+ StatusForm->ftpCon->TransferType = ftBinary;
+ StatusForm->ftpCon->ChangeDir(ist->Directory.c_str());
+ }
+ catch(...) {
+ MessageBox(0, "Can't connect. Please check your configuration.", "Connection Error", MB_OK);
+ StatusForm->Button1Click(0); // abort thread
+ }
+
+ if (!Terminated) {
+ if (dirTransfer) {
+ StatusForm->ftpCon->ChangeDir(src.c_str());
+ TStringList *dirText = new TStringList();
+ StatusForm->ftpCon->List(dirText, "*", true);
+ TIdFTPListItems *dirList = StatusForm->ftpCon->DirectoryListing;
+ for (int i = 0; i < dirList->Count; i++) {
+ if (dirList->Items[i]->ItemType != ditDirectory) {
+ buffer = dest + "/" + (dirList->Items[i]->FileName.c_str());
+// files->Strings[i].c_str();
+ if (!strcmp(&buffer.c_str()[buffer.length()-suffix.length()], suffix.c_str())) {
+ buffer2 = "Downloading (";
+ buffer2 += IntToStr(i+1).c_str();
+ buffer2 += " of ";
+ buffer2 += IntToStr(dirList->Count).c_str();
+ buffer2 += "): ";
+ buffer2 += (dirList->Items[i]->FileName.c_str());
+ // SWLog::systemlog->LogInformation("%s", buffer.c_str());
+ TMainForm::createParent(buffer.c_str()); // make sure parent directory exists
+ Synchronize((TThreadMethod)&PreDownload1);
+ try {
+ StatusForm->currentFileSize = dirList->Items[i]->Size;
+ StatusForm->ftpCon->Get(dirList->Items[i]->FileName.c_str(), buffer.c_str(), true, false);
+ }
+ catch(...) {
+ MessageBox(0, "Can't download file. If you have not done so recently, you might try pressing the Refresh from Remote Source button.", "Download Error", MB_OK);
+ StatusForm->Button1Click(0); // abort thread
+ }
+ if (Terminated)
+ break;
+ }
+ }
+ }
+ }
+ else {
+ Synchronize((TThreadMethod)&PreDownload2);
+ try {
+ StatusForm->ftpCon->Get(src.c_str(), dest.c_str(), true, false);
+ }
+ catch(...) {StatusForm->abort = true;}
+ }
+ try {
+ StatusForm->ftpCon->Disconnect();
+ }
+ catch(...){}
+ }
+*/
+}
+
+
+void __fastcall TStatusForm::TFTPThread::FTPLinkPacketRecvd(TObject *Sender)
+{
+// Synchronize((TThreadMethod)&UpdateBytes);
+}
+
+
+//void __fastcall TStatusForm::TFTPThread::UpdateBytes(void) {
+void __fastcall TStatusForm::UpdateBytes(void) {
+ StatusForm->statusBar->Caption = IntToStr(StatusForm->currentByteCount) + " bytes out of " + IntToStr(StatusForm->currentFileSize) + " transferred (" + IntToStr((int)((float)(StatusForm->currentByteCount + 1) / (float)(StatusForm->currentFileSize + 1) * 100)) + "%)";
+ StatusForm->statusBar->Repaint();
+}
+
+
+void __fastcall TStatusForm::TFTPThread::CreateFTPObject(void)
+{
+// FTPLink = new TNMFTP(0);
+}
+
+
+void __fastcall TStatusForm::TFTPThread::PreConnect(void)
+{
+ buffer = "Connecting to server at ";
+ buffer += ist->Source.c_str();
+ buffer += "...";
+ StatusForm->actionBar->Caption = buffer.c_str();
+ StatusForm->statusBar->Caption = "";
+ StatusForm->Repaint();
+}
+
+
+void __fastcall TStatusForm::TFTPThread::PreDownload1(void)
+{
+// SWLog::systemlog->LogInformation("Creating parent dir: %s", buffer.c_str());
+// SWLog::systemlog->LogInformation("Return: %d", ret);
+ StatusForm->actionBar->Caption = buffer2.c_str();
+ StatusForm->statusBar->Caption = "";
+ StatusForm->Repaint();
+}
+
+
+void __fastcall TStatusForm::TFTPThread::PreDownload2(void)
+{
+ buffer = "Downloading: ";
+ buffer += src.c_str();
+ StatusForm->actionBar->Caption = buffer.c_str();
+ StatusForm->statusBar->Caption = "";
+ StatusForm->Repaint();
+ MainForm->createParent(dest.c_str()); // make sure parent directory exists
+}
+
+
+void __fastcall TStatusForm::Cleanup(TObject *Sender)
+//void __fastcall TStatusForm::TFTPThread::Cleanup()
+{
+ if (abort)
+ StatusForm->ModalResult = mrCancel;
+ else StatusForm->ModalResult = mrOk;
+// StatusForm->Close();
+}
+
+void __fastcall TStatusForm::FormClose(TObject *Sender, TCloseAction &Action)
+{
+ suffix = "";
+ MainForm->SetFocus();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TStatusForm::Button1Click(TObject *Sender)
+{
+ abort = true;
+// ftpCon->Abort();
+ ftpThread->Terminate();
+}
+//---------------------------------------------------------------------------
+
+/*
+void __fastcall TStatusForm::ftpConWork(TObject *Sender,
+ TWorkMode AWorkMode, const int AWorkCount)
+{
+ currentByteCount = AWorkCount;
+// Synchronize((TThreadMethod)&UpdateBytes);
+ UpdateBytes();
+}
+*/
+//---------------------------------------------------------------------------
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm
new file mode 100644
index 0000000..bf8609e
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.dfm
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h
new file mode 100644
index 0000000..d4b2094
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/StatusFrm.h
@@ -0,0 +1,89 @@
+//---------------------------------------------------------------------------
+#ifndef StatusFrmH
+#define StatusFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+//#include <NMFtp.hpp>
+#include "MainFrm.h"
+//#include "IdBaseComponent.hpp"
+//#include "IdComponent.hpp"
+//#include "IdFTP.hpp"
+//#include "IdTCPClient.hpp"
+//#include "IdTCPConnection.hpp"
+#include <curl/curl.h>
+#include <curl/types.h>
+#include <curl/easy.h>
+//---------------------------------------------------------------------------
+
+class TFTPCon {
+public:
+ string Host;
+ string Username;
+ string Password;
+ bool Passive;
+ string cwd;
+
+};
+
+class TStatusForm : public TForm
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TPanel *Panel2;
+ TButton *Button1;
+ TPanel *statusBar;
+ TPanel *Panel3;
+ TPanel *actionBar;
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall Cleanup(TObject *Sender);
+ void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+ void __fastcall Button1Click(TObject *Sender);
+// void __fastcall ftpConWork(TObject *Sender, TWorkMode AWorkMode,
+// const int AWorkCount);
+private: // User declarations
+ class TFTPThread : public TThread {
+ bool abort;
+ InstallSourceTab *ist;
+ string src;
+ string dest;
+ string buffer;
+ string buffer2;
+ string suffix;
+ bool dirTransfer;
+ bool passive;
+ protected:
+ void __fastcall Execute();
+ public:
+// TNMFTP *FTPLink;
+ __fastcall TFTPThread(InstallSourceTab *iist, const char *isrc, const char *idest, bool idirTransfer = false, bool CreateSuspended = false, bool ipassive = false, const char *suffix = "");
+ __fastcall TFTPThread::~TFTPThread();
+ void __fastcall FTPLinkPacketRecvd(TObject *Sender);
+ void __fastcall CreateFTPObject(void);
+ void __fastcall PreConnect(void);
+ void __fastcall PreDownload1(void);
+ void __fastcall PreDownload2(void);
+// void __fastcall Cleanup(void);
+ } *ftpThread;
+public: // User declarations
+ TFTPCon *ftpCon;
+ long currentByteCount;
+ long currentFileSize;
+ InstallSourceTab *ist;
+ string src;
+ string dest;
+ string suffix;
+ bool dirTransfer;
+ bool passive;
+ bool abort;
+ void __fastcall UpdateBytes();
+ __fastcall TStatusForm(TComponent* Owner);
+ __fastcall ~TStatusForm();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TStatusForm *StatusForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp
new file mode 100644
index 0000000..98a97d9
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.cpp
@@ -0,0 +1,15 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "UninstallFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TUninstallForm *UninstallForm;
+//---------------------------------------------------------------------------
+__fastcall TUninstallForm::TUninstallForm(TComponent* Owner)
+ : TForm(Owner)
+{
+}
+//---------------------------------------------------------------------------
diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm
new file mode 100644
index 0000000..3a2f310
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.dfm
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h
new file mode 100644
index 0000000..45fdd7f
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/UninstallFrm.h
@@ -0,0 +1,26 @@
+//---------------------------------------------------------------------------
+#ifndef UninstallFrmH
+#define UninstallFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TUninstallForm : public TForm
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TPanel *Panel2;
+ TProgressBar *ProgressBar1;
+ TLabel *Label1;
+private: // User declarations
+public: // User declarations
+ __fastcall TUninstallForm(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TUninstallForm *UninstallForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp b/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp
new file mode 100644
index 0000000..8d5713f
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/arrow2r.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp b/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp
new file mode 100644
index 0000000..a1c4068
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/arrow3u.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/back.bmp b/apps/windoze/CBuilder5/InstallMgr/back.bmp
new file mode 100644
index 0000000..966e157
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/back.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp b/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp
new file mode 100644
index 0000000..5389910
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/bookshut.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp b/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp
new file mode 100644
index 0000000..0da70ab
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/bulblk.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp b/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp
new file mode 100644
index 0000000..61c7e5b
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/bulbon.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/check.bmp b/apps/windoze/CBuilder5/InstallMgr/check.bmp
new file mode 100644
index 0000000..09307a9
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/check.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp
new file mode 100644
index 0000000..5b77797
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.cpp
@@ -0,0 +1,67 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "cipherfrm.h"
+#include <swmgr.h>
+#include <swconfig.h>
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TCipherForm *CipherForm;
+//---------------------------------------------------------------------------
+__fastcall TCipherForm::TCipherForm(TComponent* Owner)
+ : TForm(Owner)
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TCipherForm::Button2Click(TObject *Sender)
+{
+ SectionMap::iterator section;
+ ConfigEntMap::iterator entry;
+ SWConfig *modconf = new SWConfig(confFile.c_str());
+ string tmpBuf;
+
+ section = modconf->Sections.find(modName);
+ if (section != modconf->Sections.end()) {
+ entry = section->second.find("CipherKey");
+ if (entry != section->second.end()) {
+ entry->second = CipherForm->cipherEdit->Text.c_str();
+ modconf->Save();
+ delete modconf; // close file
+ modconf = 0;
+ SWMgr *mgr = new SWMgr();
+ SWModule *mod = mgr->Modules[modName];
+ mod->SetKey("Ipet 2:12");
+ tmpBuf = mod->StripText();
+ mod->SetKey("gen 1:10");
+ tmpBuf += "\r\n\r\n";
+ tmpBuf += mod->StripText();
+ Memo1->Text = tmpBuf.c_str();
+ delete mgr;
+ }
+ }
+ if (modconf)
+ delete modconf;
+
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TCipherForm::FormShow(TObject *Sender)
+{
+ string tmpCaption;
+ tmpCaption = "Cipher Key: [";
+ tmpCaption += modName;
+ tmpCaption += "]";
+ Caption = tmpCaption.c_str();
+}
+//---------------------------------------------------------------------------
+
+
+void __fastcall TCipherForm::FormClose(TObject *Sender,
+ TCloseAction &Action)
+{
+ Memo1->Text = "";
+}
+//---------------------------------------------------------------------------
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm
new file mode 100644
index 0000000..98d9beb
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.dfm
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h
new file mode 100644
index 0000000..dba1e59
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/cipherfrm.h
@@ -0,0 +1,37 @@
+//---------------------------------------------------------------------------
+#ifndef cipherfrmH
+#define cipherfrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include <string>
+//---------------------------------------------------------------------------
+class TCipherForm : public TForm
+{
+__published: // IDE-managed Components
+ TPanel *Panel1;
+ TPanel *Panel2;
+ TPanel *Panel3;
+ TLabel *Label1;
+ TLabel *Label2;
+ TEdit *cipherEdit;
+ TMemo *Memo1;
+ TButton *Button1;
+ TButton *Button2;
+ TButton *Button3;
+ void __fastcall Button2Click(TObject *Sender);
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+private: // User declarations
+public: // User declarations
+ std::string confFile;
+ std::string modName;
+ __fastcall TCipherForm(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TCipherForm *CipherForm;
+//---------------------------------------------------------------------------
+#endif
diff --git a/apps/windoze/CBuilder5/InstallMgr/delete.bmp b/apps/windoze/CBuilder5/InstallMgr/delete.bmp
new file mode 100644
index 0000000..d20cbf9
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/delete.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/filenew.bmp b/apps/windoze/CBuilder5/InstallMgr/filenew.bmp
new file mode 100644
index 0000000..59fb3db
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/filenew.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/floppy.bmp b/apps/windoze/CBuilder5/InstallMgr/floppy.bmp
new file mode 100644
index 0000000..5fbef0a
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/floppy.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/globe.bmp b/apps/windoze/CBuilder5/InstallMgr/globe.bmp
new file mode 100644
index 0000000..e4b661d
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/globe.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/insert.bmp b/apps/windoze/CBuilder5/InstallMgr/insert.bmp
new file mode 100644
index 0000000..7cc35c5
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/insert.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/installmgr.conf b/apps/windoze/CBuilder5/InstallMgr/installmgr.conf
new file mode 100644
index 0000000..04a349b
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/installmgr.conf
@@ -0,0 +1,8 @@
+
+[General]
+PassiveFTP=true
+
+[Sources]
+FTPSource=crosswire|ftp.crosswire.org|/pub/sword/raw/
+LocalPath=C:\tmp
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/query.bmp b/apps/windoze/CBuilder5/InstallMgr/query.bmp
new file mode 100644
index 0000000..36cd506
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/query.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/sword.bmp b/apps/windoze/CBuilder5/InstallMgr/sword.bmp
new file mode 100644
index 0000000..32c5606
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/sword.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/trash.bmp b/apps/windoze/CBuilder5/InstallMgr/trash.bmp
new file mode 100644
index 0000000..effbab9
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/trash.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/undo.bmp b/apps/windoze/CBuilder5/InstallMgr/undo.bmp
new file mode 100644
index 0000000..fc4fff6
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/undo.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp b/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp
new file mode 100644
index 0000000..4158452
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/upgdlk.bmp
Binary files differ
diff --git a/apps/windoze/CBuilder5/InstallMgr/zlib.bpf b/apps/windoze/CBuilder5/InstallMgr/zlib.bpf
new file mode 100644
index 0000000..a725d34
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/zlib.bpf
@@ -0,0 +1,25 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+USEUNIT("..\..\..\..\src\utilfuns\zlib\adler32.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\compress.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\crc32.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\deflate.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\gzio.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\infblock.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\infcodes.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\inffast.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\inflate.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\inftrees.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\infutil.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\maketree.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\trees.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\uncompr.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\untgz.c");
+USEUNIT("..\..\..\..\src\utilfuns\zlib\zutil.c");
+//---------------------------------------------------------------------------
+#define Library
+
+// To add a file to the library use the Project menu 'Add to Project'.
+
diff --git a/apps/windoze/CBuilder5/InstallMgr/zlib.bpr b/apps/windoze/CBuilder5/InstallMgr/zlib.bpr
new file mode 100644
index 0000000..635316b
--- /dev/null
+++ b/apps/windoze/CBuilder5/InstallMgr/zlib.bpr
@@ -0,0 +1,126 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+ <MACROS>
+ <VERSION value="BCB.05.03"/>
+ <PROJECT value="zlib.lib"/>
+ <OBJFILES value="..\..\..\..\src\utilfuns\zlib\adler32.obj
+ ..\..\..\..\src\utilfuns\zlib\compress.obj
+ ..\..\..\..\src\utilfuns\zlib\crc32.obj
+ ..\..\..\..\src\utilfuns\zlib\deflate.obj
+ ..\..\..\..\src\utilfuns\zlib\gzio.obj
+ ..\..\..\..\src\utilfuns\zlib\infblock.obj
+ ..\..\..\..\src\utilfuns\zlib\infcodes.obj
+ ..\..\..\..\src\utilfuns\zlib\inffast.obj
+ ..\..\..\..\src\utilfuns\zlib\inflate.obj
+ ..\..\..\..\src\utilfuns\zlib\inftrees.obj
+ ..\..\..\..\src\utilfuns\zlib\infutil.obj
+ ..\..\..\..\src\utilfuns\zlib\maketree.obj
+ ..\..\..\..\src\utilfuns\zlib\trees.obj
+ ..\..\..\..\src\utilfuns\zlib\uncompr.obj
+ ..\..\..\..\src\utilfuns\zlib\untgz.obj
+ ..\..\..\..\src\utilfuns\zlib\zutil.obj"/>
+ <RESFILES value=""/>
+ <IDLFILES value=""/>
+ <IDLGENFILES value=""/>
+ <DEFFILE value=""/>
+ <RESDEPEN value="$(RESFILES)"/>
+ <LIBFILES value=""/>
+ <LIBRARIES value=""/>
+ <PACKAGES value=""/>
+ <PATHCPP value=".;..\..\..\..\src\utilfuns\zlib"/>
+ <PATHPAS value=".;"/>
+ <PATHRC value=".;"/>
+ <PATHASM value=".;"/>
+ <LINKER value="TLib"/>
+ <USERDEFINES value=""/>
+ <SYSDEFINES value="_RTLDLL;NO_STRICT"/>
+ <MAINSOURCE value="zlib.bpf"/>
+ <INCLUDEPATH value="..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include"/>
+ <LIBPATH value="..\..\..\..\src\utilfuns\zlib;$(BCB)\lib\obj;$(BCB)\lib"/>
+ <WARNINGS value="-w-par"/>
+ <LISTFILE value=""/>
+ </MACROS>
+ <OPTIONS>
+ <IDLCFLAGS value="-I..\..\..\..\src\utilfuns\zlib -I$(BCB)\include -I$(BCB)\include\vcl
+ -I..\..\..\..\include -src_suffix cpp -boa"/>
+ <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tW -tWM"/>
+ <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+ <AFLAGS value="/mx /w2 /zn"/>
+ <LFLAGS value=""/>
+ </OPTIONS>
+ <LINKER>
+ <ALLOBJ value="$(OBJFILES)"/>
+ <ALLLIB value=""/>
+ </LINKER>
+ <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=2
+Item0=..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl;..\..\..\..\include
+Item1=..\..\..\..\src\utilfuns\zlib;$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=..\..\..\..\src\utilfuns\zlib;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[CORBA]
+AddServerUnit=1
+AddClientUnit=1
+PrecompiledHeaders=1
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+ </IDEOPTIONS>
+</PROJECT> \ No newline at end of file